私は無期限に実行し続けたいPythonスクリプトを書いた。ほとんどの時間は眠りますが、時々起きて何かをしなければなりません。 EC2インスタンスで実行する必要があり、この操作を実行中にターミナル接続を切断する必要があります。
私はこれが理想的な解決策だと思います。
#!/bin/bash
while true; do
python monitor.py >>monitor.log 2>&1
echo "monitor.py exited with code $?. Respawning.." >&2
sleep 2
done
このファイルを実行し、次の名前monitor.sh
で別の名前で保存します。
./monitor.sh >>monitor.log 2>&1 &
1日か2日後に戻って次のように実行すると:
ps aux | grep monitor
私は通常出力にmonitor.shとmonitor.pyが見えますが、しかし、常にそうではありません。時には両方とも見えません。したがって、両方のプロセスで何が起こっています。
予想される動作は、何らかの理由で(終了コード0など)monitor.pyが終了すると、エコーされた行がログファイルに表示され、Pythonスクリプトを再起動する必要があることです。
なぜできないの?おそらくここで何が起こっているのかは、私のスクリプトが時々中断されることです。
&
シェルスクリプトを実行するときは、端末との接続を解除するために末尾にを追加してからログアウトします。これが問題の一部ですか?
echo "monitor.py exited with code $?. Respawning.." >&2
特に直接終了しない限り、kill $pid_of_monitor.py
ログファイルに結果は表示されません。独自のプロセスを実行すると、Pythonスクリプトが失敗したというメッセージがログファイルに表示されません。これからどんな結論を導き出すべきかわかりません。