CentOS7 の systemctl が、プロセスがすでに終了した後、再起動時に ExecStop を呼び出す

CentOS7 の systemctl が、プロセスがすでに終了した後、再起動時に ExecStop を呼び出す

次のような systemd スクリプトがあります。

 [Unit]
 Description=My sites
 Before=shutdown.target reboot.target halt.target

 [Service]
 Type=oneshot
 ExecStart=/bin/bash -c '/etc/xxx/mySites start'
 ExecStop=/bin/bash -c '/etc/xxx/mySites stop'
 KillMode=none
 SendSIGKILL=no
 TimeoutStopUSec=5min
 TimeoutSec=5min
 TimeoutStopSec=5min


 [Install]
 WantedBy=multi-user.target

さて、実行しようとすると、sudo systemctl start mySites.serviceサービスが実行され、すべてのものが正しく起動しているように見えます。 を実行してstopも動作します。その後、OS の起動時にも正しく起動します。問題は OS のシャットダウンにあります。再起動していますが、WAS もExecStop呼び出されたようですが、遅すぎます... ログを見ると、プロセスがすべて強制終了されたことがわかります。

 signal 15, SIGTERM, received from process 1 userId 0
 si_code: 0, SI_USER, signal from kill(2), sigsend(2), raise(3C) or abort(3C)
 si_signo 15  si_errno 0

つまり、ExecStop最初に開始したプロセスを誰かがすでに終了しているため、呼び出されるのが遅すぎるようです。それでも、私はすでに設定していますBefore=shutdown.target reboot.target halt.target

問題は、 がデフォルトのタイムアウトよりも長くかかる可能性があり、その結果 systemd が SIGTERM を送信することになるのではないかと思います。現在、 、およびすべての可能なタイムアウトを 5 分にExecStop設定しており、(は確実に5 分未満で終了します)。KillMode=noneSendSIKKILL=noTimeoutStopUSecTimeoutSecTimeoutStopSecExecStop

まだ運がない。

これを修正するにはどうすればいいでしょうか? CentOS 7 を実行しています。

前もって感謝します、

答え1

試す

[Unit]
Description=My sites
After=NetworkManager.service
Requires=NetworkManager.service

[Service]
Type=oneshot
ExecStart=/bin/bash -c '/etc/xxx/mySites start'
ExecStop=/bin/bash -c '/etc/xxx/mySites stop'
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

関連情報