run.sh
クラッシュが発生した場合は、再起動するためにシェルスクリプトを使用してPythonスクリプトを実行しています。
#!/bin/sh
COMMAND='nohup python3 -u test.py run >> py.log &'
LOGFILE=restart.txt
writelog() {
now=`date`
echo "$now $*" >> $LOGFILE
}
writelog "Starting"
while true ; do
$COMMAND
writelog "Exited with status $?"
writelog "Restarting"
done
私は走っている
nohup sh -u run.sh > output&
問題は、Pythonが最初の出力(print())だけをpy.logにストリーミングすることです。。ストリームをすぐに出力するにはどうすればよいですか?私もそれを試しましたCOMMAND=./test.py run >> py.log &
。どんな助けにも感謝します。ありがとうございます。
答え1
シェルスクリプトがスクリプト'run >> py.log &'
に文字列を渡しているため、test.py
正しく実行されない可能性があります。
スクリプトを少し変更する必要があります。
#!/bin/sh
COMMAND='nohup python3 -u test.py run'
LOGFILE=restart.txt
writelog() {
now=`date`
echo "$now $*" >> $LOGFILE
}
writelog "Starting"
while true ; do
$COMMAND >> py.log &
writelog "Exited with status $?"
writelog "Restarting"
done
今$COMMAND
バックグラウンドで実行し、出力をpy.log
。
ソーススクリプトが機能しない理由は、出力リダイレクトを設定した後にシェル変数が拡張され、>>
シェル&
コマンドの一部として認識されなくなり、Pythonスクリプトにパラメータ文字列として渡されるためです。LESS='+/SIMPLE COMMAND EXPANSION' man bash
コマンド処理ステップを参照できます。
答え2
最後に、モジュールを使用してredirect_stdout
出力をファイルにリダイレクトし、次に各sys.stdout.flush()
。今、リアルタイムで出力をストリーミングしています。print()
COMMAND='./test.py run'