1. 程式人生 > >Python: [Errno 32] Broken pipe異常分析

Python: [Errno 32] Broken pipe異常分析

問題描述

一個比較簡單的應用場景,在子程序中處理一些基本的業務邏輯,無socket相關的通訊。
def subprocess():
	......
	
def mainprocess():
	pid = os.fork()
	if pid == 0:
		subprocess()
近期該業務模組不能正常工作,並報告[Errno 32] Broken pipe異常。 執行環境:Python 2.6, Ubuntu 9.04

問題分析

[Errno 32] Broken pipe異常屬於IOError,因此此問題和IO操作有關。檢查相關的業務邏輯:
1. 之前的處理,相關的日誌均通過log模組記錄到檔案中,無此異常 2. 檢查相關的原始碼的修改記錄,發現近期有開發人員沒有使用log模組記錄日誌,而採用了print直接操作,初步推測可能和這部分程式碼有關 根據上述分析,通過Eclipse+Pydev的環境進行除錯,居然可以正常執行;但shell下啟動響應的指令碼卻依然有異常。print語句將輸出資訊定向到標準輸出上,是否是輸出滿了導致的。進一步檢視shell的啟動程式碼,使用類似"nohup test.py"的形式啟動,沒有進行重定向輸出重定向。

問題解決方案

綜合上面的考慮,給出解決方案: 1. 直接使用print列印資訊不是一個好的開發習慣,應該將資訊記錄到日誌檔案中;這樣本身可以消除此問題 2. 啟動指令碼時,重定向標準輸出:nohup test.py > /dev/null &2 > 1,將錯誤輸出重定向到標準輸出上,同時將標準輸出重定向到/dev/null上。