systemctl stop serviceは何をしてくれるか


結論

デーモン停止コマンドをたたいて(たいていはSIGTERM)、同一グループに属するプロセスにも停止コマンドをたたく。

systemctl

Systemdが提供するシステムとサービスマネージャの管理用コマンド。

下記コマンドでプロセスを終了できる。

systemctl stop [サービス名]

systemd stopで実行されるコマンド

  1. [サービス名].serviceファイルのExecStopパラメータに指定されたコマンドが実行される。
  2. ExecStopが設定されていない場合は、KillSignalパラメータで指定されているシグナルをサービスのプロセスに送信する。
  3. KillModeの設定に従って、サービスのグループに属するプロセスにも終了シグナルを送信する。

KillSignalのデフォルトはSIGTERMです。
KillModeのデフォルトはcontrol-groupで、サービスに属する子プロセスが終了されます。

systemd.serviceより

ExecStop=
ExecStart=によって開始されたサービスを停止するために実行するコマンドです。この引数(パラメータ)は、ExecStartと同様の形式で複数のコマンドラインを指定できます。この引数は省略可能です。この引数によって指定されたコマンドが実行されると、サービスが停止したことが通知され、サービスのためのプロセスはKillMode=の設定したがって全て終了されます。ExecStop=が未設定の場合、プロセスはKillSignal=で指定されたシグナルを使って終了されます。指定子と環境変数の置換をサポートしています。(例えば$MANPID)
サービスを終了することを依頼するコマンドを指定するだけ(例えば、何らかの形で終了シグナルをキューイングする)では、終了するまで待つわけではないため、大抵は不十分であることに注意してください。このコマンドが実行されたあと、サービスの残されたプロセスはKillMode=KillSignal=によって終了されるため、クリーンな停止が行われない場合があります。したがって、このコマンドは非同期ではなく同期された動作を行うものを指定してください。

ExecStopを調べる

root@ytnk-VirtualBox:~# systemctl show tomcat8|grep ExecStop
ExecStop={ path=/etc/init.d/tomcat8 ; argv[]=/etc/init.d/tomcat8 stop ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }

参考