web-dev-qa-db-ja.com

systemd再起動=常に混乱

実行中のシステムサービスを作成して開始するときに、スクリプトを実行するために、.serviceファイルにRestart = alwaysを含めると、これは再び実行されることを意味しますExecStartスクリプトが終了し、ループでスクリプトを実行し続けますか?

以下にあるプロジェクトのサービスファイルを見て、ここで何が起こっているのかを正確に理解しようとしています。 app_script.sh startは継続的に呼び出されますか、それともシステムサービスが停止した場合にのみ呼び出されますか?私はこれについて混乱しています。

[Unit]
Description=application script 
ConditionPathExists=/application
After=network.target app.service data.service 

[Service]
Type=simple
ExecStart=/application/app_script.sh start
ExecStop=/application/app_script.sh stop
#RemainAfterExit=yes
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target
1
Engineer999

.serviceファイルにRestart = alwaysを含める場合、これは、スクリプトの終了後に再びExecStartを実行し、ループでスクリプトを実行し続けることを意味しますか?

Restartオプションは、開始されたプロセスが終了した場合にのみ呼び出されます。 systemd.serviceのドキュメント によると、alwaysを使用すると、次の理由でプロセスが終了した場合にサービスが再起動されます。

  • 終了コードまたはシグナルをクリーンアップする
  • 汚れた終了コード
  • 汚れた信号
  • タイムアウト
  • ウォッチドッグ

ドキュメントには次のように書かれています。

上記の設定の例外として、RestartPreventExitStatus =(以下を参照)で終了コードまたはシグナルが指定されている場合、またはsystemctl stopまたは同等の操作でサービスが停止されている場合、サービスは再起動されません。また、RestartForceExitStatus =で終了コードまたはシグナルが指定されている場合、サービスは常に再起動されます(以下を参照)。

RestartForceExitStatusもRestartPreventExitStatusも構成していないため、プロセスはsystemctl stop(「または同等の操作」)中にのみsystemdによって停止されます。

App_script.sh startは継続的に呼び出されますか、それともシステムサービスが停止した場合にのみ呼び出されますか?

どちらも、それに関する限り。上記のように、継続的に呼び出されることはありません。 serviceが停止した場合も呼び出されません(もちろん、/application/app_script.sh stopの呼び出しは別として)。サービスによって開始されたプロセスが停止した場合のみ。

Type=simpleサービスは、ExecStartパラメーターを実際のサービスと見なすようにsystemdに指示することに注意してください。 /application/app_script.sh startの命名規則は、おそらく1つ以上の他のスクリプトまたはバイナリを呼び出すシェルスクリプトが含まれていることを意味します。シェルスクリプトがそのプロセスをフォークしてそれ自体が終了した場合、systemdはサービスプロセスが終了したと見なします。

2
Jeff Schaller