RHEL 7.4でyum update
の後でサービスを再起動しようとしています。 systemctlを使用してすべてのサービスを再起動できましたが、needs-restarting
のyum utils
は、systemd自体も再起動する必要があることを示しています。
# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21
サーバーを再起動せずにsystemd
を再起動できますか?
私はsystemctl daemon-reload
についていくつかの言及を見つけましたが、これによってニーズの再起動リストから消えることはありません。
デーモンを再起動するには、次を実行します
systemctl daemon-reexec
これは the systemctl
manpage に文書化されています:
Systemdマネージャーを再実行します。これにより、マネージャーの状態がシリアル化され、プロセスが再実行されて、状態が再度逆シリアル化されます。このコマンドは、デバッグとパッケージのアップグレード以外にはほとんど役に立ちません。場合によっては、ヘビーウェイト
daemon-reload
として役立つことがあります。デーモンが再実行されている間、ユーザー構成に代わってリスニングするすべてのソケットsystemdは引き続きアクセス可能です。
残念ながら、needs-restarting
はsystemd
が実際に再起動したことを確認できません。 systemd
execs
自体を再起動しますが、プロセスの開始時間はリセットされません。ただし、needs-restarting
は、実行可能ファイルの変更時刻をプロセスの開始時刻と比較して、プロセスを(特に)再起動する必要があるかどうかを判断し、その結果、常にsystemd
を再起動する必要があると見なします。 .. systemd
を本当に再起動する必要があるかどうかを判断するには、lsof -p1 | grep deleted
の出力を確認します。systemd
はライブラリに含まれているlibsystemd-shared
を使用します。同じパッケージであり、デーモンとともにアップグレードされるため、systemd
を再起動する必要がある場合は、削除されたバージョンのライブラリを使用してそれを確認できます。 lsof
に削除されたファイルが表示されない場合、systemd
を再起動する必要はありません。 (ヒントについては Jeff Schaller に感謝します!)
私の場合、systemd
をアップグレードしたばかりで、systemctl
コマンドが失敗していました。
# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied
ただし、init
マンページによれば、PID 1として実行されているデーモンにSIGTERM
を送信することで同じことができます。
kill -TERM 1
これによりデーモンがリロードされ、その後すべてのsystemctl
コマンドが再び機能し始めました。