该问题是针对以下问题的后续措施:如何暂停和恢复流程
我已经从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的所有子级吗?
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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句