ポップアップは次のものと対話できません。「古いライブラリを使用するデーモン」「どのサービスを再起動する必要がありますか?」

ポップアップは次のものと対話できません。「古いライブラリを使用するデーモン」「どのサービスを再起動する必要がありますか?」

「デーモンは古いライブラリを使用しています。」ポップアップ「どのサービスを再起動する必要がありますか?」というメッセージが表示されると、スクリプトと対話できなくなり、スクリプトが中断されました。これは、aptを使用してパッケージをインストールまたは更新するときに発生します(スクリプトまたは直接シェルから)。このスクリプトは多くのソフトウェアとパッケージをインストールします。例は次のとおりです。

ここに画像の説明を入力してください。

私はいくつかの異なるシェルとデバイスでこれを試しました。私のUbuntuのバージョンは20.04です。

Enter / Returnを登録せず、キーボード入力(下矢印など)は次のことを行います。

ここに画像の説明を入力してください。

なぜこれが起こるのかわからず、このように壊れるのを防ぐ方法(またはポップアップを完全に防ぐ方法)を知りたいです。

iTermをインストールしましたが、動作は変わりませんでした。 ここに画像の説明を入力してください。

以下は、関連する可能性のあるスクリプトの一部です(問題を解決するために最初に追加したものを含む)。

echo '* libraries/restart-without-asking boolean true' | sudo debconf-set-selections

# Set noninteractive frontend for apt-get to avoid prompts
export DEBIAN_FRONTEND=noninteractive

# Define the file path
FILE_PATH="/etc/needrestart/needrestart.conf"

# Check if the file exists
if [ -f "$FILE_PATH" ]; then
    # Use sed to replace 'i' with 'a' for the specific configuration
    sudo sed -i "s/\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/g" "$FILE_PATH"
    
    echo "The file has been updated successfully."
else
    echo "The specified file does not exist."
fi

sudo dpkg-reconfigure -f noninteractive needrestart

sudo systemctl restart needrestart.service
echo '* libraries/restart-without-asking boolean true' | sudo debconf-set-selections
echo 'needrestart needrestart/restart-services boolean true' | sudo debconf-set-selections

# Update the package list and install dependencies
sudo apt-get update && \
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y

# Set timezone
ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime && \
apt-get update && \
apt-get install -y tzdata && \
dpkg-reconfigure --frontend noninteractive tzdata

# Set environment variable for timezone
export TZ=America/New_York

# Attempt to install locales and generate en_US.UTF-8
apt-get update && \
apt-get install -y locales && \
locale-gen en_US.UTF-8

# Update packages, fix installations, install sudo, cleanup
apt-get update && \
apt-get install -f && \
apt-get install -y --no-install-recommends sudo && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

答え1

あなたが言及した特定のポップアップはneedrestart(あなたのスクリプトがそれを構成しているのですでに知っていると仮定しています)によって生成されます。

needrestartフックによって呼び出されます。ここに関連する2つのフックはそれとaptフックdpkgです。環境変数をnull以外の値に設定して、aptフックを一時的に無効にすることができます。NEEDRESTART_SUSPENDこのdpkgフックは設定できませんが、名前を変更して無効にできます。

NEEDRESTART_MODE環境変数を使用して(構成ファイルを変更する代わりに)モード構成設定をオーバーライドできることにも注意する価値があります。

次のアプローチをお勧めします。

  1. needrestartスクリプトからすべての調整を削除します。

  2. NEEDRESTART_SUSPENDnull以外の値に設定してエクスポートします。

    export NEEDRESTART_SUSPEND=1
    
  3. NEEDRESTART_MODE「自動」または「リスト」に設定:

    export NEEDRESTART_MODE=l
    
  4. 上記が不十分な場合は、dpkgスクリプトの先頭でフックを無効にします。

    [ -f /etc/dpkg/dpkg.cfg.d/needrestart ] && mv /etc/dpkg/dpkg.cfg.d/needrestart /etc/dpkg/dpkg.cfg.d/needrestart.disabled
    

    端から(または出口トラップから)

    [ -f /etc/dpkg/dpkg.cfg.d/needrestart.disabled ] && mv /etc/dpkg/dpkg.cfg.d/needrestart.disabled /etc/dpkg/dpkg.cfg.d/needrestart
    

古いライブラリを使用してデーモンを再起動するには、スクリプトの最後にneedrestart明示的に実行する必要があります。

関連情報