Ubuntu 16.04.5 LTS(AWS)を使用しています。
次のコマンドを使用してPythonプロセスを作成しています。
nohup python -u main.py > nohup.out 2>&1 &
ctrl-c/SIGINTをプロセスに送信したいのでkill -2 <pid>
。
端末でプロセスを開始すると、正常に動作し、プログラムはキーボード割り込みを受け取り、正常に閉じます。
.sh
スクリプトまたは他のbashプロセス(例えば)を介してプロセスを開始するときbash -c 'nohup python -u main.py > nohup.out 2>&1 &'
。 (どちらの方法も同じ方法でプロセスを開始すると思います。)プロセスを送信すると、プロセスはSIGINTを受け取りません。
SIGTERM(デフォルトkill
)は正常に機能し、プロセスを終了しますが、プロセスを正常に終了させることはできませんが、必要です。
どうしたの?
答え1
いいえ、彼らは異なって始めます。 Bash はジョブ制御がオフの状態でスクリプトを実行するため、コマンドのバックグラウンドモードは次に終了します。&
スクリプトからSIGINTとSIGQUITを無視して入力を/dev/null
。
私を見て回答ここ(これを説明する標準を参照)。
あなたの場合、これは「正常な」シャットダウンを実行するようにmain.py
設定されたハンドラを持っていませんが、Control-Cによって強制的にシャットダウンしたり、対話型シェルで実行されたときに単にシャットダウンされることを意味します。ハンドラを設定すると、そのハンドラはスクリプトで実行されるときに親シェルの設定処理も無視します。SIGINT
kill -2
SIG_IGN
SIGINT