2017-08-01 85 views
0

我試圖通過一個python腳本,即'ifconfig -a eht0'在linux機器上獲取網絡接口的信息。所以我用下面的代碼:Python:從後臺子進程獲取標準輸出

import subprocess 
proc = subprocess.Popen('ifconfig -a eth0', shell=True, stdout=subprocess.PIPE) 
proc.wait() 
output = proc.communicate()[0] 

那麼,如果我執行從終端的腳本

python myScript.py 

python myScript.py & 

它工作正常,但在運行時從後臺(由crontab啓動)沒有活動外殼,我無法得到輸出。

有什麼想法?

謝謝

+1

你怎麼用'output'來查看它是否有效(無論是在後臺還是在主動shell)?你把它保存到一個文件?如果是這樣,文件是否被創建,但沒有內容或根本沒有文件? –

+0

如果你不設置'shell = True',比如'proc = subprocess.Popen(['ifconfig','-a','eth0'],stdout = subprocess.PIPE)''是否有區別? –

+0

輸出被髮送到遠程數據庫,並且當它從終端運行時,我可以讀取數據。雖然如果我使用'shell = False'我得到這個錯誤'OSError:[Errno 2]沒有這樣的文件或目錄' – user3734366

回答

1

您是否試過使用「屏幕」?

proc = subprocess.Popen('screen ifconfig -a eth0', shell=True, stdout=subprocess.PIPE) 

我不確定它是否可以正常工作。

+0

如果你不確定它應該是一個評論,而不是一個答案 –

+0

SO用戶少50以上的聲望無法評論他人的帖子。 – orangeInk

+0

是的,我無法評論。我以前遇到過同樣的問題。該解決方案爲我工作。但我不確定它是否適用於其他人 – Toandd

0

嘗試proc.stdout.readline()而不是溝通,subprocess.Popen()中的stderr = subprocess.STDOUT可能會有所幫助。請發佈結果。

+0

從終端啓動腳本會給出'eth0 Link encap:Ethernet HWaddr 18:b2:23:a4:12:1e'而不是完整的輸出,並且如果由cron運行,它會再次提供空字符串。 – user3734366

+0

我建議你使用proc.communicate。你有沒有試過用2>&1重定向標準錯誤輸出? –

+0

也嘗試從crontab調用腳本,並在調用腳本的行重定向輸出(可能相關,我不是一個強大的crontab用戶[link](https://unix.stackexchange.com/questions/) 52330 /如何對重定向輸出到一個文件從 - 內 - 的cron) –

0

我發現問題的解決方案,我猜系統無法識別由crontab執行的功能ifconfig。因此,添加子進程的完整路徑允許腳本正確執行:

`proc = subprocess.Popen('/sbin/ifconfig -a eth0',shell=True,stdout=subprocess.PIPE) 
proc.wait() 
output = proc.communicate()[0]` 

現在我可以管理輸出字符串。

謝謝

相關問題