systemd 219でRHEL7.Xを実行すると、次の設定を使用して「myService」というsystemdサービスがあります。
ExecStart=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh start
ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop
KillMode=none
Restart=no
Type=notify
NotifyAccess=all
###Can't use ExitType until Systemd 250 release ( systemctl --version )
#ExitType=cgroup
ExecStartスクリプトを呼び出すと、いくつかの相互依存プロセスが実行され、MAINPID =を使用してNOTIFY更新を起動スクリプトからsystemdに送信し、単一のPIDを使用して最も重要であると考えるプロセスであるsystemctlステータスを監視します。次のようになります。
● [email protected] - "myService Instance : myInstance"
Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: disabled)
Active: active (running) since Thu 2022-06-16 15:19:40 BST; 23h ago
Process: 9700 ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop (code=exited, status=0/SUCCESS)
Main PID: 6099 (myMainProcess)
時々、このMAINPIDは失敗して終了しますが、アプリケーション自体は自己修復され、通常は回復するため、/etc/systemd/system/myService.service定義ファイルでそれを使用します。
KillMode=none
Restart=no
この「失敗した」状態シナリオでは、次のsystemctl状態を取得しますが、これは主な結果ではありません。上記の自己回復により、この誤った状態を一時的に受け入れることがあります。
● [email protected] - "myService Instance : myInstance"
Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2022-06-17 14:58:44 BST; 1s ago
Process: 9700 ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop (code=exited, status=0/SUCCESS)
Process: 6099 ExecStart=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh start (code=exited, status=1/FAILURE)
Main PID: 6099 (code=exited, status=1/FAILURE)
しかし、時にはアプリケーションを回復できず、必要なクリーンアップを通じてすべてのサービスを「完全に」終了しようとします。 ExecStopスクリプトはこれをうまく行います。
しかし、これを実行すると何も実行されないようです。
systemctl stop myService@myInstance
ちなみに実行すると、ExecStartの起動メッセージがすぐに表示されます。
systemctl restart myService@myInstance
だから私にとって、ExecStopスクリプトは「失敗した状態」にあるときは決して実行されません。
次のコマンドを実行してみましたが、ExecStopでも機能しませんでした。
systemctl reset-failed myService@myInstance
● [email protected] - "myService Instance : myInstance"
Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: disabled)
Active: inactive (dead) since Fri 2022-06-17 15:30:16 BST; 8min ago
Process: 9700 ExecStop=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh stop (code=exited, status=0/SUCCESS)
Process: 27952 ExecStart=/bin/bash /asp_APPL/myInstance/script/myServiceSystemdCtrl.sh start (code=killed, signal=KILL)
Main PID: 27952 (code=killed, signal=KILL)
とにかく、ExecStopスクリプトがsystemctlコマンド/コンテキストでのみ実行されるように強制できます。クリーンアップのためにExecStopスクリプトの側面を手動で実行できることを理解しています。しかし、スクリプトのすべての内部システムの意味を考慮すると、分離するのは難しいです。