スタートアップ サービス スクリプトの停止ルーチンを作成しています。
do_stop()
{
rm -f $PIDFILE
pkill -f $DAEMON || return 1
return 0
}
問題は、pkill (killall と同じ) もスクリプト自体を表すプロセスと一致し、基本的にそれ自体を終了することです。それを修正する方法は?
結果から現在の PID を明示的に除外できます。
kill $(pgrep -f $DAEMON | grep -v ^$$\$)
フラグを正しく使用するには-f
、部分文字列だけでなく、デーモンへのパス全体を指定してください。これにより、スクリプトを強制終了できなくなり (上記の必要がなくなりますgrep
)、デーモンの名前を共有する他のすべてのシステム プロセスも強制終了できなくなります。
あなたの質問から判断すると、あなたは pgrep と pkill の使用に苦労していないので、一般的に使用される他のオプションをいくつか示します。
1) killproc
from/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、または%PPID
pidof が pidof を呼び出すスクリプトとして解釈する特別な変数です。最後に、デーモンがスクリプトの場合は、-x が必要になるため、bash や python を強制終了するのではなく、その名前でスクリプトを強制終了しようとします。
for pid in $(pidof -o %PPID -x progd); do
kill -TERM $pid
done