如何像bash一样暂停和恢复进程


13

该问题是针对以下问题的后续措施:如何暂停和恢复流程

我已经从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+Zbash时,它将暂停Firefox。当我发出命令bg(或fg)时,它将恢复Firefox。这是预期的。

当我kill -s SIGTSTP 27980在另一个终端中发出命令时,它将[1]+ Stopped firefox在第一个终端中打印该行(就像我按时一样CTRL+Z),但是它不会挂起firefox。我假设它只是挂起外壳脚本。

当我kill -s SIGTSTP 27989在另一个终端中发出命令(注意PID)时,它将暂停Firefox。第一终端不注意这一点。

bash如何暂停整个进程树?它只是遍历所有树和SIGTSTP的所有子级吗?



你应该添加pgid到您的ps命令来查看@geekosaur在谈论进程组。
ninjalj 2011年

Answers:


17

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


7
顺便说一句,当您键入时,bash不会执行; 由于的进程组是终端的当前进程组,因此终端驱动程序(通常是行规程)将发送到该进程组中的所有进程。 正在继续(以及其他任何工作)。其他终端信号,例如和,工作方式相同。(元数据:SE讨厌ctrl-反斜杠。)SIGTSTP^ZfirefoxSIGTSTPbashwaitpid()^C^\
geekosaur 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.