[英]Run Bash Commands in Parallel and Exit Both of Them
我有以下要运行的脚本。 问题在于它无法正常退出; 当我按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 &
jobs
的-p
选项将返回仍在运行的后台作业的列表。 您可以将其传递给信号处理程序以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
约“没有这样的过程”。
使用将终止进程的命令捕获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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.