Python 出力をリダイレクトするシェル スクリプトを使用して Python スクリプトを実行する

Python 出力をリダイレクトするシェル スクリプトを使用して Python スクリプトを実行する

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'

関連情報