2012-02-22 25 views
5

que tienen un "guión" escritura del golpe, que más o menos se parece a:tubo de fiesta y sigterm

#!/bin/bash 

cmd1 | cmd2 | cmd3 

Cuando hago un kill script (o más precisamente cuando hago un 'script de detención' en supervisord), no todos cmd * son asesinados. ¿Cómo puedo asegurarme de que terminen junto con la secuencia de comandos que los generó?

+0

¿Quizás debería estar en [su]? –

Respuesta

5

Supervisord tiene una opción killasgroup (falsa por defecto) que determina si propagar señales de detención/terminación a procesos secundarios.

[program:script] 
command=script 
killasgroup=true 

https://github.com/Supervisor/supervisor/blob/master/supervisor/process.py#L354

+0

Parece muy prometedor, aunque en este momento no puedo probar esto realmente: he agregado una verificación 'parent pid' a todos mis scripts para que los procesos secundarios salgan solos cuando el proceso principal cambie (a '1' muy probablemente) – jldupont

+2

* (La edición sugerida de Anónimo se movió para comentar) * Probablemente también desees establecer en verdadero la opción stopasgroup para asegurarte de que este comportamiento se usa en todas las situaciones (por ejemplo, con el comando "reiniciar"). Tenga en cuenta que esas opciones no están presentes en las versiones anteriores del supervisor. – Andomar

2

No estoy seguro de cómo usar supervisord, pero con pkill puede usar la opción para matar desde un proceso primario a todos los secundarios. Aquí están los árboles de proceso (comenzando desde mi ejecución de ssh daemon).

$ pstree -a -p 1792 
sshd,1792 
    ├─sshd,27150 
    │ └─sshd,27153 
    │  └─zsh,27154 
    │   └─test.sh,27325 ./test.sh 
    │    └─cat,27326 
    └─sshd,27182 
     └─sshd,27184 
      └─zsh,27185 
       └─pstree,27357 -a -p 1792 

En una sesión Tengo un script test.sh con pid 27325, y en la otra estoy ejecutando el comando pstree -a -p 1792 (porque sshd tenían pid 1792)

Y después de ejecutar pkill -TERM -P 27325:

$ pstree -a -p 1792 
sshd,1792 
    ├─sshd,27150 
    │ └─sshd,27153 
    │  └─zsh,27154 
    └─sshd,27182 
     └─sshd,27184 
      └─zsh,27185 
       └─pstree,27387 -a -p 1792 

esta pregunta reformularse esencialmente de la esta otra respuesta en stackoverflow: https://stackoverflow.com/a/392155/263969

+0

+1 Interesante, pero no es exactamente lo que necesito. – jldupont

0

Otra solución es atrapar SIGTERM y matar a todos los niños en la trampa de código.

Lo único es que el shell ejecuta un código de captura para una señal recibida solo después de que se haya completado el comando actualmente en ejecución, por lo que en su caso, esto solo no ayudaría.

Sin embargo, las trampas se ejecutarán de una manera "asíncrona" si el shell está en "espera".

#!/usr/bin/env bash 
trap 'kill 0' TERM 
(cmd1 | cmd2 | cmd3) & wait 

El kill 0 envía SIGTERM a todos los procesos en el grupo de proceso actual.

NOTA: Estoy hablando de Bash aquí.