杀死一组具有负 PID 的进程

Spa*_*sle 7 process kill process-groups

kill -TERM -PID 
Run Code Online (Sandbox Code Playgroud)

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

背景:
我有一个 shell 脚本正在运行。在脚本中,我使用 wget 下载东西。所以脚本是父进程,wget 是子进程。我想使用 kill -TERM -PID_OF_SCRIPT 杀死它们

Run*_*ium 8

它是说“没有这样的 PID”还是有错误,就像这行得通吗?

kill -TERM -- -GPID
Run Code Online (Sandbox Code Playgroud)

另请注意,根据(强调我的)
man 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
Run Code Online (Sandbox Code Playgroud)

pkill -TERM -g PGRP


小智 6

该错误消息/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
'
Run Code Online (Sandbox Code Playgroud)