如何从bash脚本中杀死Django runserver子进程?

jjt*_*jjt 13 python django bash shell

我正在Django网站上工作,我有各种需要运行的编译程序(Compass/Sass,coffeescript,hamlpy),所以我为了方便起见制作了这个shell脚本:

#!/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
Run Code Online (Sandbox Code Playgroud)

除了Django服务器之外的所有东西都在a上很好地关闭,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
Run Code Online (Sandbox Code Playgroud)

第一个PID 29725是初始python manage.py runserver调用,但29732它是实际的开发服务器进程.

编辑看起来这是由于Django的自动重载功能,可以使用该--noreload标志禁用.由于我想保留自动重新加载功能,现在的问题是如何从bash脚本中终止子进程.我会认为杀死最初的python runserver命令会这样做......

jjt*_*jjt 14

解决了

感谢这个问题,我已将脚本更改为:

#!/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
Run Code Online (Sandbox Code Playgroud)

前面带有短划线的PID使用kill命令操作PID组,并$$引用bash脚本本身的PID.

谢谢你的帮助,我!
没问题,自我,嘿 - 你太棒了.