私はバックグラウンドでPythonスクリプトを実行するスクリプトランチャー(bash)を持っているので、起動してからターミナル/ ssh接続を閉じることができます。バックグラウンドプロセスがLinux上で作業を完了した後のクリーンアップ
実行するスクリプトの名前とそこに渡すオプションの引数を受け入れます。次に、Pythonスクリプト(デタッチ)を起動し、同じディレクトリにPID(Pythonスクリプトのファイル)を作成します。このファイルからPIDを使用して、後でサーバーに再接続してこのバックグラウンドプロセスを終了させることができます。
また、このPIDファイルは、すでに実行されている(シングルトン)場合に同じスクリプトが開始されないようにするために使用されます。
問題は、Pythonスクリプトが作業を終えた後、このPIDファイルを削除する方法がわかりません。私はこれをbashスクリプト、Pythonソリューション(すべての場合に使用したいので)、またはのスクリーンツールで実装する必要があります。このスーパーバイザ(スクリプト終了後にPIDファイルを削除する)もバックグラウンドで実行する必要があります(!)ので、私は同じことをすることができます:ターミナルセッションを閉じます。
#!/bin/bash
PIDFILE=$1.pid
if [ -f $PIDFILE ]; then
echo "Process is already running, PID: $(< $PIDFILE)"
exit 1
else
nohup python $1 "${@:2}" > /dev/null 2>&1 &
PID=$!
echo $PID > $PIDFILE
# supervisor
nohup sh -c "wait $PID; rm -f $PIDFILE" > /dev/null 2>&1 &
fi
この例ではPIDファイルがすぐに削除され、はすぐコマンド戻りを待つ(私は新しいプロセスはの子ではないからだと思うので、私がこれまで試したどのような
現在のものなので、待ちは私の予想どおりこの場合は機能しません)。
どのように実装することができますか? は基本的に、私はその作業を終了します(この場合はPythonの)前のスクリプトまで待ち、その後、PIDファイルを削除します。このライン
nohup sh -c "wait $PID; rm -f $PIDFILE" > /dev/null 2>&1 &
に置き換えるために何かを必要としています。
UPD:問題はであり、子プロセス以外のプロセスを待つことができないため、コマンドを待機しています。 、シェルスクリプトの場合
#!/bin/bash
function cleanup {
while [ -e /proc/$1 ]; do
sleep 1;
done
rm -f $PIDFILE
}
PIDFILE=$1.pid
if [ -f $PIDFILE ]; then
echo "Process is already running, PID: $(< $PIDFILE)"
exit 1
else
python $1 "${@:2}" > /dev/null 2>&1 &
PID=$!
echo $PID > $PIDFILE
cleanup $PID > /dev/null 2>&1 &
disown
fi
このソリューションは、Pythonにロックされているが、私だけでなく、Pythonスクリプトを実行しますので、私は何かイムを必要としますBashで実装された –
ああ、謝罪、一瞬。 – bschlueter
このコードの問題は、Pythonスクリプトが作業を終了するまでブロックされることです。このスーパーバイザーはバックグラウンドでも作業する必要があるので、このスクリプトランチャーはすぐに作業を終了する必要があります(Pythonスクリプトの起動、スーパーバイザーの起動、終了)。 –