シェルスクリプトを使用して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()。今、リアルタイムで出力をストリーミングしています。print()COMMAND='./test.py run'

関連情報