2012-05-30 59 views
12

我正在一个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命令将做到这一点...

回答

13

解决

感谢this SO question,我已经改变了我的脚本是:

#!/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命令,$$引用bash脚本本身的PID。

感谢您的帮助,我!
没问题,自我,嘿 - 你真棒。

+0

+1洋洋自得 – jstaab

0

您可以执行此杀死或进程和服务器,你设定的端口号:

$ netstat -tulpn | grep PORT | awk '{print $7}' | cut -d/ -f 1 | xargs kill 

OR

$ sudo lsof -i tcp:PORT 
$ sudo lsof -i tcp:PORT|awk '{print $2}'|cut -d/ -f 1|xargs kill