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 ...
+1 para autocongratulación – jstaab