Как убить подпроцессы Django для запуска сервера из bash script?
Я работаю на сайте Django, где у меня есть различные программы компиляции, которые нужно запустить (Compass/Sass, coffeescript, hamlpy), поэтому я сделал эту оболочку script для удобства:
#!/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
Все, кроме сервера Django, отлично закрывается на ctrl+c
, потому что PID серверного процесса не является идентификатором PID команды python manage.py runserver
. Это означает, что каждый раз, когда я останавливаю script, я должен найти PID рабочего процесса и отключить его.
Вот пример:
$> ./compile.sh
RMX using siteroot....
...
[ctrl+c]
PIDS: 29725 29726 29728 29729
$> ps -A | grep python
29732 pts/2 00:00:00 python
Первый PID, 29725
, является начальным вызовом python manage.py runserver
, но 29732
является фактическим процессом сервера dev.
edit Похоже, что это связано с функцией автоматической перезагрузки Django, которую можно отключить с помощью --noreload
флаг. Так как я хотел бы сохранить функцию автоматической перезагрузки, теперь возникает вопрос, как убить дочерние процессы из bash script. Я думаю, что убить начальную команду python runningerver сделает это...
Ответы
Ответ 1
РЕШЕННЫЙ
Благодаря этому вопросу SO, я изменил свой script на это:
#!/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, которым предшествует тире, работают с группой PID с помощью команды kill
, а $$
ссылается на PID самого bash script.
Спасибо за помощь, меня!
Нет проблем, я, и эй, ты классный.