kill -TERM -PID
PIDとすべての子プロセスを終了する必要があります。
しかし、これはopenSUSEでは機能しません。どのPIDを使用しても、常にそのようなプロセスPIDがないことを伝えます。
したがって、この特定のバージョンのkillが負のPIDオプションをサポートしていない場合、プロセスグループを終了する最良の方法は何ですか?
背景:
シェルスクリプトを実行しています。スクリプトはwgetを使用してものをダウンロードします。したがって、scriptは親プロセスであり、wgetは子プロセスです。 kill -TERM -PID_OF_SCRIPT を使って殺したい。
答え1
「該当するPIDなし」と表示されていますか?それともエラーがありますか? - 動作しますか?
kill -TERM -- -GPID
また(強調内)によると
男1:
"[...] '-n' 形式の引数が指定された場合、これは次を示すためのものです。プロセスグループ[… ]」
男2:
"[...] pid が -1 より小さい場合、プロセス内のすべてのプロセスに sig が送信されます。IDが-pidのプロセスグループ。[… ]」
男3:
「[...] pidが負であるが-1でない場合、sigは以下を実行するすべてのプロセス(未指定のシステムプロセスセットを除く)に送信されます。プロセスグループIDpidの絶対値と同じです。 [… ]」
たとえば、PIDではなくプロセスグループIDです。
そうでなければ楽しく遊べると思います。/proc/[pid]/stat
ppid: awk '{gsub(/\([^)]+\)/,"_"); print $4}' /proc/3955/stat
pgrp: awk '{gsub(/\([^)]+\)/,"_"); print $5}' /proc/3955/stat
pkill -TERM -g PGRP
答え2
エラーメッセージは/bin/kill: -23958: No such process
pidによっても発生する可能性があります23958
。いいえpgid(プロセスグループID番号)!
たとえば、スクリプトが誤ってpgidとして使用されたバックグラウンドシェル(またはコマンド)を終了しようとすると、これが発生する可能性が$!
あります。ただし、ジョブ制御が有効なシェルでは$!
pgidとして使用できます(参照:Linuxで親プロセスが終了した後も子プロセスがまだ生きているのはなぜですか?)。
# examples of how to kill a process group
# (using sh -c '...' instead of a shell script)
# kill: -<num>: No such process
sh -c '
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'
# in Terminal.app
# job control is enabled by default
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
# enable job control
sh -c '
set -m
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'
# make sure pid == pgid
# note that the script gets killed as well
sh -c '
echo pid $$
trap "trap - EXIT; echo pid $$ was killed" EXIT
(sleep 200 & sleep 200 & sleep 200) &
IFS=" " read -r pgid <<EOF
$(ps -p $! -o pgid=)
EOF
sleep 5
/bin/kill -s TERM -${pgid}
sleep 5
echo pid $$ was not killed
'
# use a pseudo-terminal (pty) to avoid killing the script
# note the use of -$$ instead of -$!
sh -c '
echo pid $$
script -q /dev/null sh -c '\''
trap "" HUP
(sleep 200 & sleep 200 & sleep 200) &
sleep 5
/bin/kill -s TERM -$$
'\''
sleep 5
echo pid $$ was not killed
'
答え3
他のStackExchangeサイトのこのスレッドに示すように、「pkill」または「killtree」ソリューションを使用できます。 :)
https://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes
pkill -TERM -P PARENT_PID
答え4
基本オペレーティングシステムでBusyboxを使用している場合は、Error: kill: bad signal name '-'
これが問題である可能性が高いです--
。
kill -TERM -- -[gpid]
基本信号であるTERMだけでなく、指定する必要がありますkill -- -[gpid]
。
理由はわかりません。