Esta pregunta es un seguimiento de: Cómo suspender y reanudar procesos
He comenzado firefox desde una sesión bash en gnome-terminal.
El árbol de procesos se ve así:
$ 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
Cuando golpeo CTRL+Z
en bash, suspenderá firefox. Cuando emito el comando bg
(o fg
) se reanudará Firefox. Esto es como se esperaba.
Cuando emito el comando kill -s SIGTSTP 27980
en otra terminal, imprimirá la línea [1]+ Stopped firefox
en la primera terminal (al igual que cuando presiono CTRL+Z
), pero no suspende Firefox. Supongo que solo suspende el script de shell.
Cuando emito el comando kill -s SIGTSTP 27989
(tenga en cuenta el PID) en otro terminal, suspenderá firefox. La primera terminal no toma nota de esto.
¿Cómo bash suspende todo el árbol de procesos? ¿solo atraviesa el árbol y SIGTSTP a todos los niños?
fuente
pgid
a sups
comando para ver los grupos de procesos de los que habla @geekosaur.Respuestas:
Los trabajos de Shell viven en "grupos de procesos"; mira la
PGRP
columna enps
salida extendida . Estos se utilizan tanto para el control del trabajo como para determinar quién "posee" un terminal (real o pty).POSIX (tomado del Sistema V) usa una ID de proceso negativa para indicar un grupo de proceso, ya que el primer proceso del grupo identifica al grupo de proceso ("líder del grupo de proceso"). Entonces, usted usaría
ps
para determinar el grupo de procesoskill -s TSTP "-$pgrp"
. (Intentaps -u"$USER" -opid,ppid,pgrp,cmd
)En su árbol de procesos, el grupo de procesos comienza con la
firefox
secuencia de comandos iniciada porbash
, por lo que el grupo de procesos sería 27980 y el comando seríakill -s TSTP -27980
.Naturalmente, para reanudar el grupo de procesos, tema
kill -s CONT -- -27980
.fuente
bash
no está haciendo loSIGTSTP
que escribes^Z
; desdefirefox
's grupo de procesos es grupo de proceso actual del terminal, el controlador de terminal (pedantemente, disciplina de línea) envía laSIGTSTP
a todos los procesos en ese grupo de proceso.bash
solo lo estáwaitpid()
haciendo (y cualquier otro trabajo). Otras señales terminales, como^C
y^\
funcionan de la misma manera. (meta: SE odia esa barra ctrl-barra invertida ...)