杀死一组PID为负的进程

杀死一组PID为负的进程
kill -TERM -PID 

应该杀死 PID 及其所有子进程。
但这在openSUSE上不起作用,它总是告诉我没有这样的进程-PID,无论我使用什么PID。
那么,如果这个特定版本的kill不支持负PID选项,那么杀死一组进程的最佳方法是什么?

背景:
我正在运行一个 shell 脚本。在脚本中,我使用 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 应发送到所有进程(不包括一组未指定的系统进程),其进程组ID等于pid的绝对值,[…]”

例如,不是 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也可能是由于 pid23958pgid(进程组ID号)!

例如,如果您尝试终止脚本中错误地用作$!pgid 的后台 shell(或命令),则可能会出现这种情况;但是,在启用作业控制的 shell 中,$!可以用作 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

您可以使用“pkill”或“killtree”解决方案,如其他 StackExchange 站点上的此线程所示:)

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]而不仅仅是kill -- -[gpid]. TERM 是默认信号。

我不知道为什么。

相关内容