¿Por qué el PGID de mi hijo no procesa el PID del padre?

13

Así que sigo leyendo en todas partes que este comando debe terminar todos los procesos secundarios del proceso primario:

kill -- -$$

El uso de una ID negativa con el comando kill hace referencia a un PGID y, según los ejemplos que he visto, parece que el PGID de los procesos secundarios debería ser el PID del padre pero no es el caso en mi sistema.

En mi sistema, el PGID del niño es el mismo que el PGID del script principal, que resulta ser bash.

¿Que está pasando aqui? ¿Los ejemplos fueron incorrectos o mi sistema está configurado de manera diferente?

Lo que necesito lograr es terminar los procesos secundarios sin terminar el padre, por lo que no quiero enviar una señal de interrupción al PGID en el que está el padre.

TCZ8
fuente

Respuestas:

11

Creo que te refieres a PGID, que significa Process Group ID .

Cuando se bifurca un proceso, hereda su PGID de su padre. El PGID cambia cuando un proceso se convierte en un líder de grupo de proceso , luego su PGID se copia de su PID. A partir de ese momento, el nuevo hijo procesa el desove y sus descendientes heredan ese PGID (a menos que inicien nuevos grupos de proceso propios).

En un shell con control de trabajo, como la mayoría de los shells interactivos, cada trabajo se coloca en su propio grupo de procesos. Si ejecuta un script de shell, el proceso de shell que ejecuta el script será el líder del grupo y el PGID será igual a su PID.

En un shell sin control de trabajo, como la mayoría de los shells utilizados para ejecutar scripts, los comandos se ejecutan en el grupo de procesos del shell.

La sintaxis kill -- -Nmata todos los procesos en el grupo con PGID = N. No se puede usar con un PID arbitrario, solo el PID de un líder de grupo de procesos, ya que ese es el PGID. Esto es esencialmente cómo la cáscara

kill %jobid

la sintaxis funciona: se traduce internamente %jobiden el PGID del trabajo y envía la señal a ese PGID.

No hay una manera simple de ejecutar un script en su propio grupo de procesos desde otro script de shell. Sin embargo, consulte Cómo configurar el grupo de procesos de un script de shell para obtener algunas sugerencias.

Barmar
fuente
¿Estás diciendo que un shell con o sin control de trabajo hace lo mismo?
TCZ8
1
No. Un shell con control de trabajo inicia un nuevo grupo de procesos para cada trabajo. Un shell sin control de trabajo no inicia un nuevo grupo de procesos para cada trabajo, los ejecuta en su propio grupo de procesos.
Barmar
wow ... No lo leí bien la primera vez. Entonces, ¿supongo que lo que quiero es activar el control de trabajo? ¿Eso garantizaría que los niños tengan un PGID que coincida con el PID del script principal? ¿O cada niño obtendrá su propio PGID único?
TCZ8
Encontré algunos documentos en línea sobre controles de trabajo, voy a pasar por eso. Gracias por tu ayuda Barmar.
TCZ8
1
Con el control del trabajo, cada niño obtiene su propio PGID. Sin control de trabajo, heredan el PGID del padre. Pero el padre podría haber heredado su PGID de su padre, si no es un líder de grupo de procesos.
Barmar