2012-05-30 11 views
12

Estoy trabajando en un sitio web Django donde tengo varios programas de compilación que necesitan para funcionar (Compass/Sass, CoffeeScript, hamlpy), por lo que hizo esta secuencia de comandos shell por conveniencia:¿Cómo matar los subprocesos de Django runserver desde un script bash?

#!/bin/bash 
SITE=/home/dev/sites/rmx 

echo "RMX using siteroot=$SITE" 
$SITE/rmx/manage.py runserver & 
PIDS[0]=$! 
compass watch $SITE/media/compass/ & 
PIDS[1]=$! 
coffee -o $SITE/media/js -cw $SITE/media/coffee & 
PIDS[2]=$! 
hamlpy-watcher $SITE/templates/hamlpy $SITE/templates/templates & 
PIDS[3]=$! 

trap "echo PIDS: ${PIDS[*]} && kill ${PIDS[*]}" SIGINT 

wait 

todo a excepción de la El servidor Django se cierra bien en un ctrl+c porque el PID del proceso del servidor no es el PID del comando python manage.py runserver. Lo que significa que cada vez que detengo el script, tengo que encontrar el PID del proceso en ejecución y apagarlo.

He aquí un ejemplo:

$> ./compile.sh 
    RMX using siteroot.... 
    ... 
    [ctrl+c] 
    PIDS: 29725 29726 29728 29729 
$> ps -A | grep python 
    29732 pts/2 00:00:00 python 

El primer PID, 29725, es el python manage.py runserver llamada inicial, pero 29732 es el proceso real del servidor prog.

edición Parece que esto se debe a Django's auto-reload feature que se puede desactivar con la bandera --noreload. Como me gustaría mantener la característica de recarga automática, la pregunta ahora es cómo matar los procesos secundarios del script bash. Me gustaría pensar matar el comando inicial de ejecución del servidor pitón lo haría ...

Respuesta

13

RESUELTO

Gracias a this SO question, he cambiado de secuencia de comandos para esto:

#!/bin/bash 
SITE=/home/dev/sites/rmx 

echo "RMX using siteroot=$SITE" 
$SITE/rmx/manage.py runserver & 
compass watch $SITE/media/compass/ & 
coffee -o $SITE/media/js -cw $SITE/media/coffee & 
hamlpy-watcher $SITE/templates/hamlpy $SITE/templates/templates & 

trap "kill -TERM -$$" SIGINT 

wait 

PID precedido con el dash opera en el grupo PID con el comando kill, y el $$ hace referencia al PID del propio script bash.

Gracias por la ayuda, yo!
No hay problema, sí mismo, y oye, eres increíble.

+0

+1 para autocongratulación – jstaab

0

Puede ejecutar este para matar o proceso y servidores, establecer el número de puerto:

$ netstat -tulpn | grep PORT | awk '{print $7}' | cut -d/ -f 1 | xargs kill 

O

$ sudo lsof -i tcp:PORT 
$ sudo lsof -i tcp:PORT|awk '{print $2}'|cut -d/ -f 1|xargs kill 
Cuestiones relacionadas