我正在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
除了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脚本中终止子进程。我认为杀死最初的python runserver命令就可以了......
答案 0 :(得分:14)
已解决
感谢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使用kill
命令在 PID组上运行,$$
引用bash脚本本身的PID。
谢谢你的帮助,我! 没问题,自我,嘿 - 你太棒了。
答案 1 :(得分:0)
您可以执行此操作来终止或处理服务器,您可以设置PORT编号:
$ 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