Shell-Script

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

  • October 29, 2021

run.sh如果崩潰,我正在使用 shell 腳本執行我的 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 只會將第一個 output(print()) 流式傳輸到 py.log。我怎樣才能得到立即流式傳輸的輸出。我也試過了COMMAND=./test.py run >> py.log &。我將不勝感激。謝謝你。

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

您的 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處理命令中使用的步驟。

引用自:https://unix.stackexchange.com/questions/572048