PID为负表示这其实是PGID (Process Group ID),向这个PGID中的所有进程发信号。
例:向34325
进程组的所有进程发送SIGTERM
:
kill -TERM -34325
¶ 查看进程组的方法
ps -efj
。来源:PID, PPID, PGID与SID
¶ 在一个新的进程组中运行命令
脚本里运行命令时,默认会继承当前进程组。如果要让命令在新的进程组中运行,可以在脚本中先开启"monitor mode" (job control)
:
set -m
局部生效:
(set -m; sleep 10)
来源:https://stackoverflow.com/questions/6549663/how-to-set-process-group-of-a-shell-script
在后台运行:
(set -m; sleep 10 &)
打印生成的后台进程的进程号:
(set -m; sleep 10 & echo $! )
注意&
本身已经表示了语句的结尾,所以&
后面如果再加;
的话bash
会报错:
$ (set -m; sleep 10 &; echo $! )
bash: syntax error near unexpected token `;'
不过zsh允许空语句;
,所以不会报错。
将生成的后台进程的进程号保存到变量:
pid=$(set -m; sleep 10 > /dev/null & echo $! )
echo $pid
command substitution会等待所有stdout的writer关闭管道,因此要将sleep 10
的stdout重定向到/dev/null
。来源:https://stackoverflow.com/questions/51507719/why-is-this-command-substitution-waiting-for-the-background-job-to-finish