Cómo suspender y reanudar procesos como bash hace

13

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+Zen 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 27980en otra terminal, imprimirá la línea [1]+ Stopped firefoxen 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?

lesmana
fuente
2
Ver también ¿ Diferencia entre grupo de procesos y trabajo? .
Gilles 'SO- deja de ser malvado'
Debe agregar pgida su pscomando para ver los grupos de procesos de los que habla @geekosaur.
ninjalj

Respuestas:

17

Los trabajos de Shell viven en "grupos de procesos"; mira la PGRPcolumna en pssalida 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 pspara determinar el grupo de procesos kill -s TSTP "-$pgrp". (Intenta ps -u"$USER" -opid,ppid,pgrp,cmd)

En su árbol de procesos, el grupo de procesos comienza con la firefoxsecuencia de comandos iniciada por bash, por lo que el grupo de procesos sería 27980 y el comando sería kill -s TSTP -27980.

Naturalmente, para reanudar el grupo de procesos, tema kill -s CONT -- -27980.

geekosaur
fuente
77
Por cierto, bashno está haciendo lo SIGTSTPque escribes ^Z; desde firefox's grupo de procesos es grupo de proceso actual del terminal, el controlador de terminal (pedantemente, disciplina de línea) envía la SIGTSTPa todos los procesos en ese grupo de proceso. bashsolo lo está waitpid()haciendo (y cualquier otro trabajo). Otras señales terminales, como ^Cy ^\ funcionan de la misma manera. (meta: SE odia esa barra ctrl-barra invertida ...)
geekosaur