1

私は書いてい/etc/init.d/mydaemonます:

# ...
source functions # LSB compliant 

EXEC=/usr/local/bin/mydaemon
PROG=mydaemon

function start() {
  daemon --pidfile=/var/run/mydeamon.pid ${EXEC}
}

function stop() {
  killproc ${PROG}
}

# ...

私の/usr/local/bin/mydaemon

#!/bin/bash
trap "trap TERM ; kill 0" TERM
binary with some args

私の知る限り、これは次の理由で機能するはずです。

  • daemonmydaemonの PID を記録します/var/run/mydaemon.pid
  • killprocその PID を読み取り、その PID に送信SIGTERMします。
  • mydaemonこのシグナルをトラップし、トラップを無効にして、 のプロセスを含むSIGTERM全体に送信します。PGRPbinary with some args

ただし、これは機能しません。サービスを停止した後、mydaemon終了しますが、binaryまだ実行中です。

何が欠けていますか?デーモンとそのすべての子を停止するためのベストプラクティスは何ですか?


ところで:

/usr/local/bin/mydaemon が次の場合:

#!/bin/bash
binary with some args &
echo $! $$ > /var/run/mydaemon.pid
wait

適切に動作しますが、これは私には堅牢性が低いように思われ、これが適切でない場合があります (バイナリ呼び出しがそれほど単純でない場合、または独自の子がある場合など)。

4

3 に答える 3

3

親プロセスの ID を pkill に渡すと、すべての子プロセスが強制終了されます。

pkill -TERM -P parentID
于 2012-09-04T13:59:43.823 に答える
1

trapSIGINT を受信したときにクリーンアップ プロセスを処理する を設定できます。例えば:

function cleanup { kill $CHILDPID; exit 0; }
trap cleanup SIGINT SIGTERM

その他の例については、こちらを参照してください。

于 2012-09-04T14:01:18.553 に答える