繁体   English   中英

并行运行Bash命令并退出两者

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM