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()
after eachと を使用しました。これで、出力がリアルタイムでストリーミングされます。print()
COMMAND='./test.py run'