13

我正在一个 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

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

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

4

2 回答 2

14

解决了

感谢这个 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 组进行操作,并且引用 bash 脚本本身的 PID。kill$$

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

于 2012-05-30T18:11:28.033 回答
0

你可以执行这个来杀死或处理和服务器,你设置端口号:

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

或者

$ sudo lsof -i tcp:PORT
$ sudo lsof -i tcp:PORT|awk '{print $2}'|cut -d/ -f 1|xargs kill
于 2018-03-02T10:40:46.150 回答