web-dev-qa-db-ja.com

再起動せずにsystemdを再起動できますか?

RHEL 7.4でyum updateの後でサービスを再起動しようとしています。 systemctlを使用してすべてのサービスを再起動できましたが、needs-restartingyum utilsは、systemd自体も再起動する必要があることを示しています。

# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21

サーバーを再起動せずにsystemdを再起動できますか?

私はsystemctl daemon-reloadについていくつかの言及を見つけましたが、これによってニーズの再起動リストから消えることはありません。

44
Benjamin

デーモンを再起動するには、次を実行します

systemctl daemon-reexec

これは the systemctl manpage に文書化されています:

Systemdマネージャーを再実行します。これにより、マネージャーの状態がシリアル化され、プロセスが再実行されて、状態が再度逆シリアル化されます。このコマンドは、デバッグとパッケージのアップグレード以外にはほとんど役に立ちません。場合によっては、ヘビーウェイトdaemon-reloadとして役立つことがあります。デーモンが再実行されている間、ユーザー構成に代わってリスニングするすべてのソケットsystemdは引き続きアクセス可能です。

残念ながら、needs-restartingsystemdが実際に再起動したことを確認できません。 systemdexecs自体を再起動しますが、プロセスの開始時間はリセットされません。ただし、needs-restartingは、実行可能ファイルの変更時刻をプロセスの開始時刻と比較して、プロセスを(特に)再起動する必要があるかどうかを判断し、その結果、常にsystemdを再起動する必要があると見なします。 .. systemdを本当に再起動する必要があるかどうかを判断するには、lsof -p1 | grep deletedの出力を確認します。systemdはライブラリに含まれているlibsystemd-sharedを使用します。同じパッケージであり、デーモンとともにアップグレードされるため、systemdを再起動する必要がある場合は、削除されたバージョンのライブラリを使用してそれを確認できます。 lsofに削除されたファイルが表示されない場合、systemdを再起動する必要はありません。 (ヒントについては Jeff Schaller に感謝します!)

48
Stephen Kitt

私の場合、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コマンドが再び機能し始めました。

4
Malvineous