systemd restart=常に混乱

systemd restart=常に混乱

実行するシステムサービスを作成して起動するときにスクリプトを実行するには、次のものを含める必要があります。再起動=常に.serviceファイルでは、これは再実行されることを意味します。実行開始スクリプトが完了した後、ループでスクリプトを実行し続けますか?

私は私のプロジェクト(以下を参照)のサービスファイルを見て、ここで何が起こっているのかを正確に理解しようとしています。 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

.serviceファイルにRestart = alwaysを含めると、スクリプトが完了したらExecStartを再実行してループ内でスクリプトを実行し続けます。

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

  • 終了コードまたは信号の消去
  • 不潔な終了コード
  • 信号がきれいではありません。
  • 停止する
  • 守る犬

文書は続きます:

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

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

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

現時点では両方ではありません。上記のように、絶えず呼び出されるわけではありません。もし提供する停止してください(もちろん電話は除く/application/app_script.sh stop)。プロセスサービスを停止して開始しました。

サービスは、引数を実際のサービスとして扱うようにType=simplesystemdに指示します。ExecStart命名規則は、/application/app_script.sh start1つ以上の他のスクリプトまたはバイナリを呼び出すことができるシェルスクリプトを含めることです。シェルスクリプトがプロセスを分岐して自己終了する場合、systemdはサービスプロセスが終了したと見なします。

おすすめ記事