解決:systemdでstartしたらExecStopまで実行されてしまう

Linux(今回は CentOS 7.9)の環境において、systemd に作成したサービスを起動しようと start したところ、 ExecStart で指定したスクリプトが実行された直後に ExecStop で指定したスクリプトまで流れてしまう事象が発生しました。

結論としては、 Service 内にて指定している Type のミスと、また【 RemainAfterExit=yes 】の指定漏れです。

原因と解決策

原因は【 Type=simple 】となっていたせいで、ExecStart で指定したコマンドが実行完了したタイミングで処理が完了したと思われて ExecStop まで流れてしまった為です。

というわけで Type の指定を Type=oneshot に変更します。これで、指定したスクリプト(今回はBashスクリプト)が実行完了しても「終了した」と勘違いされないで ExecStop は実行されません。

また合わせて、【 RemainAfterExit=yes 】の指定も必要でした。これが無いと Type=oneshot を指定するだけでは変わらず ExecStop も実行される状況です。

ちなみに RemainAfterExit=yes にすることで、サービスはそのプロセスがすべて終了していてもアクティブと見なされます。デフォルトの値は False です。
以下、Redhat のマニュアルから抜粋。
引用
True に設定すると、サービスは、そのプロセスがすべて終了していてもアクティブと見なされます。デフォルトの値は False です。このオプションは、特に Type=oneshot が設定されている場合に役に立ちます。
参考:RedHat
ちなみに書き方のサンプルとしては下記のような感じです。

sustemd
[Unit]
Description=Hogetest daemon
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/hoge/startup.sh
ExecStop=/opt/hoge/shutdown.sh
Restart=no

[Install]
WantedBy=multi-user.target
これで無事に ExecStop まで流れなくなるはず。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です