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

また、アプリケーションがうまく終了しない場合は、デフォルトのシグナル SIGTERM の代わりに、SIGHUP または SIGABRT を試すこともできます。

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