[英]Run programs in background and redirect their outputs to file in real time
我想在一個bash會話中同時運行多個python腳本,並分別實時檢查其輸出。 為了完成此任務,我編寫了一個簡單的bash腳本,如下所示:
#!/bin/bash
python 1.py > 1.output &
python 2.py > 2.output &
python 3.py > 3.output &
當我使用cat 1.output
命令檢查執行過程中已打印的內容時,什么都看不到。
想了一會兒后,我意識到1.output
必須在填寫1.py
完成執行。 換句話說,我在這里使用的方法不是real time
。
您可能會建議等待這些python腳本完成。 不幸的是,事實是那里所有的python腳本實際上都是長期運行的程序,它們可能在幾天或幾個月后完成,這就是為什么我要實時檢查其輸出。
另外,您可能建議我修改python腳本以將消息直接打印到文件而不是stdout
。 抱歉,這里的腳本太復雜而無法修改,其中包含print
功能。
我現在能做什么?
-u
開關和等效的PYTHONUNBUFFERED
環境變量強制將stdout取消緩沖。 嘗試這個:
#!/bin/bash
python -u 1.py > 1.output &
python -u 2.py > 2.output &
python -u 3.py > 3.output &
要么
#!/bin/bash
export PYTHONUNBUFFERED=yes
python 1.py > 1.output &
python 2.py > 2.output &
python 3.py > 3.output &
請注意, -u
有副作用:請閱讀文檔以了解更多信息。
參考:
如果您可以在程序中找到某種主循環,這可以很好地指示進度,則執行寫入文件將是很好的。 如果您說在Python關閉輸出流之前輸出不會填滿,那么這可能是最簡單的選擇。
您可以嘗試通過執行以下操作來覆蓋腳本中的stderr / stdout:
# in the beginning of your script
import os
import sys
desired_output_file = open('/path/to/file', 'a')
os.dup2(desired_output_file.fileno(), sys.stdout)
os.dup2(desired_output_file.fileno(), sys.stderr)
然后,所有print
調用將寫入此特殊文件,而不是stdout。 但是,主要問題可能是緩沖的IO。 您必須以某種方式將此類文件的內容flush
到磁盤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.