使用 shell 腳本重定向 python 輸出來執行 Python 腳本

使用 shell 腳本重定向 python 輸出來執行 Python 腳本

我正在使用 shell 腳本運行 python 腳本,run.sh以便在崩潰時重新啟動它:

#!/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

您的 shell 腳本正在將字串傳遞'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.

原始腳本不起作用的原因是,在設定輸出重定向後,shell 變數會擴展,因此 和>>不再&被識別為 shell 命令的一部分,並作為參數字串傳遞給 Python 腳本。您可以參考LESS='+/SIMPLE COMMAND EXPANSION' man bash處理命令的步驟。

答案2

我最終使用該模組redirect_stdout將輸出重定向到文件,然後sys.stdout.flush()在每個之後使用print()和 作為 shell 腳本COMMAND='./test.py run'。現在它正在即時串流輸出。

相關內容