簡體   English   中英

在后台運行程序,並將其輸出實時重定向到文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM