「デーモンは古いライブラリを使用しています。」ポップアップ「どのサービスを再起動する必要がありますか?」というメッセージが表示されると、スクリプトと対話できなくなり、スクリプトが中断されました。これは、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
環境変数を使用して(構成ファイルを変更する代わりに)モード構成設定をオーバーライドできることにも注意する価値があります。
次のアプローチをお勧めします。
needrestart
スクリプトからすべての調整を削除します。NEEDRESTART_SUSPEND
null以外の値に設定してエクスポートします。export NEEDRESTART_SUSPEND=1
NEEDRESTART_MODE
「自動」または「リスト」に設定:export NEEDRESTART_MODE=l
上記が不十分な場合は、
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
明示的に実行する必要があります。