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 杀死它们
它是说“没有这样的 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)