2012-06-16 34 views
2

我有一個python腳本運行在一個小型服務器上,可以通過三種不同的方式調用 - 從另一個python腳本中,通過cron或gammu-smsd(帶有美妙的移動實用程序[gammu]的SMS守護進程)。該腳本維護,並且含有以下雜牌測量系統上使用的空間(想必這是有可能從內部的Python,但這是快速和骯髒的):只有爲什麼設置stderr = subprocess.STDOUT修復了subprocess.check_output調用?

reportdict['Used Space'] = subprocess.check_output(["df/| tail -1 | awk '{ print $5; }'"], shell=True)[0:-1]

奇怪的是這條線將當腳本被從gammu-smsd運行的shell腳本調用時,失敗。即使CalledProcessError對象的輸出屬性包含正確的輸出,該行也會失敗,並顯示CalledProcessError異常並顯示「返回的退出狀態2」。 shell命令序列中唯一會給出這種錯誤狀態的命令將是awk,狀態2表示致命錯誤。

如果此行的python腳本是由cron,另一個python腳本或命令行調用的,則此行可以正常工作。我打破了我的頭,試圖修復腳本的環境,認爲這一定是問題。最後,雖然我把標準錯誤= subprocess.STDOUT,就像這樣:

reportdict['Used Space'] = subprocess.check_output(["df/| tail -1 | awk '{ print $5; }'"], stderr=subprocess.STDOUT, shell=True)[0:-1]

這是一個調試措施,以幫助我弄清楚,如果一些輸出已於標準錯誤來。但在此之後,腳本開始工作,即使從gammu-smsd呼叫!爲什麼會出現這種情況?我在使用子進程時要求將來參考...

+0

檢查gammu-smsd的stderr在哪裏。找到守護進程的pid,然後執行'ls -l/proc/XXXX/fd/[012]'。我懷疑你會發現fd 2對一些不尋常的東西是開放的 - 可能不可寫。 –

回答

2

Gammu SMSD將調用腳本,並關閉所有文件描述符(請參閱documentation),這可能是失敗的原因。

相關問題