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

2024-05-18 06:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个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并关闭它。在

下面是一个例子:

^{pr2}$

第一个PID 29725是初始的python manage.py runserver调用,但是29732是实际的dev-server进程。在

编辑看起来这是由于Django's auto-reload feature造成的,它可以用--noreload标志禁用。由于我希望保留自动重新加载特性,现在的问题是如何从bash脚本中杀死子进程。我认为终止最初的python runserver命令可以做到。。。在


Tags: djangopydev脚本bashmanage进程site
2条回答

已解决

多亏了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

前面带有破折号的PIDs使用kill命令对PID组进行操作,$$引用bash脚本本身的PID。在

谢谢你的帮助,我!
没问题,赛尔夫,嘿,你真棒。在

您可以执行此操作来终止或进程和服务器,您可以设置端口号:

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

或者

^{pr2}$

相关问题 更多 >