"systemctl stop docker.service"を実行するときは、"Restart = always"に準拠する必要がありますか?
私の理解(そしてこれは限定的)は、systemctl stopが終了コード0で停止する必要があることです。その後、「Restart = always」が設定されているため、docker.serviceが再起動されることを期待しています。つまり、終了コードは何でも再起動する必要がありますが、これは起こらないようです。
systemctl stopは特別なケースですか?それでは、ステータスコード0でdockerdを終了して、「Restart = always」が正しく機能するかどうかをテストできますか?
答え1
ご意見ありがとうございます。上記の内容(私の知識不足に基づいた最良の説明)を使って遊びながらの動作は次のとおりです。
- 上記のEval / gdpスクリプトはdocker.serviceで動作するようです。 dockerd プロセスが終了して再起動します。プロセスが状態 0 で終了したことを示すメッセージは、/var/log/messages に書き込まれません。終了状態1を使用するようにスクリプトを変更すると、メッセージログファイルにstatus = 1として記録され、サービスも再起動されます。
- SIGTERMはdocker.serviceも停止し、/var/log/messagesに終了コード状態を書き込むことなくプロセスを再起動するようにします。
- systemctl stop docker.serviceが原因でプロセスが停止し、再起動されません。
- systemctl stop systemd-udevdはプロセスを停止して再起動しないようにします。つまり、SIGSTOPのように動作します。
この最後の点は、STOPコマンドがrestart = alwaysをサポートするように設計されていないことを示すようです。
答え2
いいえ。よくわかりません。
udevのようにlibcに関連付けられたプログラムの場合:
eval $(systemctl show -p MainPID systemd-udevd)
gdb -p $MainPID
p (void)_exit(0)
quit
しかし、DockerはC ++で書かれており、go
C関数を呼び出すのにはあまり適していません(そして、おそらく独自のシステムコール実装を使用していますか?)。だからこれがdockerdで動作するかどうかわかりません。
Restart=always
期待どおりに機能していることを再確認したい場合は、systemd-udevd.serviceがすでに使用されていますRestart=always
。したがって、Restart=always
上記の内容をデモに使用できます。それは私のために動作します:-).