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
也可能是由于 pid23958
为不pgid(进程组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 是默认信号。
我不知道为什么。