我正在一个Django的网站,我有需要运行各种程序的编译上(北斗/无礼的话,CoffeeScript的,hamlpy),所以我做了这个shell脚本为了方便:如何从bash脚本中杀死Django runserver子进程?
#!/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不是python manage.py runserver
命令的PID。这意味着每次停止脚本时,我都必须找到正在运行的进程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
是实际的开发服务器进程。
编辑看起来像这是由于Django's auto-reload feature可以用--noreload
标志禁用。由于我想保留自动重载功能,现在问题变成了如何从bash脚本中终止子进程。我想杀死初始蟒蛇的runserver命令将做到这一点...
+1洋洋自得 – jstaab