这个问题是以下问题的后续问题:如何暂停和恢复进程
我已经从 gnome-terminal 中的 bash 会话启动了 Firefox。
进程树如下所示:
$ ps -e -o pid,ppid,cmd -H
1828 1 gnome-terminal
26677 1828 bash
27980 26677 /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980 /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985 /usr/lib/firefox-3.6.15/firefox-bin
28012 27989 /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true
当我点击CTRL+Z
bash 时,它会暂停 Firefox。当我发出命令bg
(或fg
)时,它将恢复 Firefox。这正如预期的那样。
当我在另一个终端中发出命令时kill -s SIGTSTP 27980
,它将[1]+ Stopped firefox
在第一个终端中打印该行(就像我点击 时一样CTRL+Z
),但它不会暂停 Firefox。我认为它只是暂停 shell 脚本。
当我在另一个终端中发出命令kill -s SIGTSTP 27989
(记下 PID)时,它将暂停 Firefox。第一终端没有注意到这一点。
bash如何挂起整个进程树?它只是遍历树并对所有子节点发出 SIGTSTP 信号吗?
答案1
Shell 作业存在于“进程组”中;查看PGRP
扩展ps
输出中的列。它们既用于作业控制,又用于确定谁“拥有”终端(真实的或私人的)。
POSIX(取自系统 V)使用负进程 ID 来指示进程组,因为进程组由组中的第一个进程(“进程组领导者”)标识。因此,您将使用ps
来确定进程组,然后kill -s TSTP "-$pgrp"
。 (尝试ps -u"$USER" -opid,ppid,pgrp,cmd
。)
在您的进程树中,进程组以firefox
启动的脚本开始bash
,因此进程组为 27980,命令为kill -s TSTP -27980
。
当然,要恢复进程组,请发出kill -s CONT -- -27980
.