systemd/ExecStop スクリプトを強制的に実行してプロセスをクリーンアップします。

systemd/ExecStop スクリプトを強制的に実行してプロセスをクリーンアップします。

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スクリプトの側面を手動で実行できることを理解しています。しかし、スクリプトのすべての内部システムの意味を考慮すると、分離するのは難しいです。

関連情報