1

我有以下要运行的脚本。问题是它没有优雅地退出。当我Ctrl-C只按指南针时会终止,但runserver仍在后台运行,需要手动终止。有没有办法让这两个优雅地退出?如果没有通过Ctrl-C,我还应该使用其他东西来一起杀死这些进程吗?

谢谢!

#!/bin/bash
cd /path/venv
source ./bin/activate
service gunicorn stop
cd /path/www/static/sass_sorting
compass watch &
/path/venv/djo/manage.py runserver &
4

2 回答 2

1

-p选项将jobs返回仍在运行的后台作业列表。您可以将其传递给kill信号处理程序。

#!/bin/bash

trap 'kill $(jobs -p)' SIGINT
cd /path/venv
source ./bin/activate
service gunicorn stop
cd /path/www/static/sass_sorting
compass watch &
/path/venv/djo/manage.py runserver &

如果可能有您想要继续运行的作业,则保存您可能想要终止的后台作业的进程 ID。

#!/bin/bash

trap 'kill $p1 $p2' SIGINT
cd /path/venv
source ./bin/activate
service gunicorn stop
cd /path/www/static/sass_sorting
compass watch & p1=$!
/path/venv/djo/manage.py runserver & p2=$!

有一个不可避免的竞争条件,因为一个进程可能总是在你检查它是否仍在运行和你真正尝试杀死它之间完成,所以你可以简单地忽略任何kill关于“没有这样的进程”的错误。

于 2013-09-17T15:48:53.193 回答
0

使用会杀死进程的命令捕获 SIGINT,并使用循环检查进程是否仍然存在。

#!/bin/bash

cd /ssdhome/development/matthew-server/venv
source ./bin/activate
service gunicorn stop
cd /ssdhome/development/matthew-server/www/static/sass_sorting

compass watch &
p1=$!
/ssdhome/development/matthew-server/venv/djo/manage.py runserver &
p2=$!

trap 'kill "$p1"; kill "$p2"' SIGINT
while kill -s 0 "$p1" || kill -s 0 "$p2"; do
    wait "$p1"; wait "$p2"
done &>/dev/null

如果它不能很好地结束您的应用程序,您还可以尝试使用 SIGHUP 或 SIGABRT,而不是默认信号 SIGTERM:

trap 'kill -s SIGHUP "$p1"; kill -s SIGHUP "$p2"' SIGINT
于 2013-09-17T15:32:12.553 回答