負のPIDを使用して一連のプロセスを終了する

負のPIDを使用して一連のプロセスを終了する
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 processpidによっても発生する可能性があります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]

理由はわかりません。

関連情報