Как убить подпроцессы сервера запуска Django из сценария bash?

Я работаю над веб-сайтом Django, где у меня есть различные программы компиляции, которые необходимо запустить (Compass/Sass, coffeescript, hamlpy), поэтому для удобства я сделал этот сценарий оболочки:

#!/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. Это означает, что каждый раз, когда я останавливаю скрипт, я должен найти 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. Я думаю, что удаление начальной команды запуска сервера Python сделает это...

13
задан jjt 30 May 2012 в 17:59
поделиться