私はBashスクリプト「スクリプト」を持っています。これは大まかに次のようになります。
#!/bin/bash
cmd1 | cmd2 | cmd3
を実行するとkill script
(より正確には、で「停止スクリプト」を実行するとsupervisord
)、すべてのcmd*が強制終了されるわけではありません。それらを生成したスクリプトとともにそれらが終了していることを確認するにはどうすればよいですか?
私はBashスクリプト「スクリプト」を持っています。これは大まかに次のようになります。
#!/bin/bash
cmd1 | cmd2 | cmd3
を実行するとkill script
(より正確には、で「停止スクリプト」を実行するとsupervisord
)、すべてのcmd*が強制終了されるわけではありません。それらを生成したスクリプトとともにそれらが終了していることを確認するにはどうすればよいですか?
Supervisordには、 SIGTERM / SIGKILLシグナルを子プロセスに伝播するかどうかを決定するstopasgroupおよびkillasgroupオプション(デフォルトではfalse)があります。
[program:script]
command=script
stopasgroup=true
killasgroup=true
(これらの構成変数は両方ともhttp://supervisord.org/configuration.htmlに文書化されています。)
の使用方法はわかりませんsupervisord
が、このオプションをpkill
使用する-P
と、親プロセスからすべての子までを強制終了できます。これがプロセスツリーです(実行中のsshデーモンから開始)。
$ pstree -a -p 1792
sshd,1792
├─sshd,27150
│ └─sshd,27153
│ └─zsh,27154
│ └─test.sh,27325 ./test.sh
│ └─cat,27326
└─sshd,27182
└─sshd,27184
└─zsh,27185
└─pstree,27357 -a -p 1792
test.sh
1つのセッションでは、 pid 27325を使用したスクリプトがあり、もう1つのセッションでは、コマンドを実行しています(pid 1792があったpstree -a -p 1792
ため)。sshd
そして私が走った後pkill -TERM -P 27325
:
$ pstree -a -p 1792
sshd,1792
├─sshd,27150
│ └─sshd,27153
│ └─zsh,27154
└─sshd,27182
└─sshd,27184
└─zsh,27185
└─pstree,27387 -a -p 1792
この回答は、基本的に、stackoverflowに関するこの他の回答から言い換えられました:https ://stackoverflow.com/a/392155/263969
別の解決策は、SIGTERMをトラップし、トラップコード内のすべての子を強制終了することです。
唯一のことは、現在実行中のコマンドが完了した後にのみ、シェルが受信信号のトラップコードを実行することです。したがって、あなたの場合、これだけでは役に立ちません。
ただし、シェルが「待機中」の場合、トラップは「非同期」の方法で実行されます。
#!/usr/bin/env bash
trap 'kill 0' TERM
( cmd1 | cmd2 | cmd3 ) & wait
はkill 0
、現在のプロセスグループ内のすべてのプロセスにSIGTERMを送信します。
注:ここではBashについて話しています。