16

スタートアップ サービス スクリプトの停止ルーチンを作成しています。

do_stop()
{
  rm -f $PIDFILE
  pkill -f $DAEMON || return 1
  return 0
}

問題は、pkill (killall と同じ) もスクリプト自体を表すプロセスと一致し、基本的にそれ自体を終了することです。それを修正する方法は?

4

3 に答える 3

16

結果から現在の PID を明示的に除外できます。

kill $(pgrep -f $DAEMON | grep -v ^$$\$)

フラグを正しく使用するには-f、部分文字列だけでなく、デーモンへのパス全体を指定してください。これにより、スクリプトを強制終了できなくなり (上記の必要がなくなりますgrep)、デーモンの名前を共有する他のすべてのシステム プロセスも強制終了できなくなります。

于 2013-04-01T09:06:14.823 に答える
1

あなたの質問から判断すると、あなたは pgrep と pkill の使用に苦労していないので、一般的に使用される他のオプションをいくつか示します。

1) killprocfrom/etc/init.d/functionsまたは/lib/lsb/init-functions(Linux のディストリビューションとバージョンに適した方) を使用します。サービス スクリプトを作成している場合、他のサービスの 1 つを例として使用していれば、既にこのファイルをインクルードしている可能性があります。

Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]

これを使用する主な利点は、SIGTERM を送信し、プロセスが終了するかどうかを確認し、必要な場合にのみ SIGKILL を送信することです。

2) killproc の秘密のソースを使用することもできます。これは、特定のプロセスを除外するオプションを使用pidofして、殺すプロセス ID を見つけることです。-oの引数は-o$$現在のプロセス ID、または%PPIDpidof が pidof を呼び出すスクリプトとして解釈する特別な変数です。最後に、デーモンがスクリプトの場合は、-x が必要になるため、bash や python を強制終了するのではなく、その名前でスクリプトを強制終了しようとします。

for pid in $(pidof -o %PPID -x progd); do
    kill -TERM $pid
done

この例は、記事「Bash: スクリプトが既に実行されているかどうかを確認する方法」で確認できます。

于 2016-09-22T21:15:53.403 に答える