6

私はBashスクリプト「スクリプト」を持っています。これは大まかに次のようになります。

#!/bin/bash

cmd1 | cmd2 | cmd3

を実行するとkill script(より正確には、で「停止スクリプト」を実行するとsupervisord)、すべてのcmd*が強制終了されるわけではありません。それらを生成したスクリプトとともにそれらが終了していることを確認するにはどうすればよいですか?

4

3 に答える 3

6

Supervisordには、 SIGTERM / SIGKILLシグナルを子プロセスに伝播するかどうかを決定するstopasgroupおよびkillasgroupオプション(デフォルトではfalse)があります。

[program:script]
command=script
stopasgroup=true
killasgroup=true

(これらの構成変数は両方ともhttp://supervisord.org/configuration.htmlに文書化されています。)

于 2012-02-23T12:11:41.087 に答える
2

の使用方法はわかりません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.sh1つのセッションでは、 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

于 2012-02-23T00:18:46.557 に答える
0

別の解決策は、SIGTERMをトラップし、トラップコード内のすべての子を強制終了することです。

唯一のことは、現在実行中のコマンドが完了した後にのみ、シェルが受信信号のトラップコードを実行することです。したがって、あなたの場合、これだけでは役に立ちません。

ただし、シェルが「待機中」の場合、トラップは「非同期」の方法で実行されます。

#!/usr/bin/env bash
trap 'kill 0' TERM
( cmd1 | cmd2 | cmd3 ) & wait

kill 0、現在のプロセスグループ内のすべてのプロセスにSIGTERMを送信します。

注:ここではBashについて話しています。

于 2012-12-21T18:11:19.387 に答える