您好,登錄后才能下訂單哦!
踩坑的程序是個常駐的Agent類管理進程, 包括但不限于如下類型的任務在執行:
發現坑的過程很有意思:
netstat -tanop|grep port_number
發現端口確實有人占用通過代碼review, 找到shell具體執行的庫代碼如下:
self._subpro = subprocess.Popen(
cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
preexec_fn=_signal_handle
)
# 重點是shell=True !
把上述代碼改為:
self._subpro = subprocess.Popen(
cmd.split(), stdout=subprocess.PIPE,
stderr=subprocess.PIPE, preexec_fn=_signal_handle
)
# 重點是去掉了shell=True
Agent會在一個新創建的threading線程中執行這段代碼, 如果線程執行時間超時(xx seconds), 會調用 self._subpro.terminate()
終止該腳本.
表面正常:
深層問題:
這樣雖然殺死了shell進程(未必死亡, 可能進入defunct狀態), 但實際的執行進程確活著. 于是1.1
中的坑就被結實的踩上了.
本節擴展知識包括二個部分:
擴展知識留到下篇末尾講述, 感興趣的可以自行搜索
如果只kill某進程的父進程, 集成了父進程資源的子進程會繼續占用父進程的資源不釋放, 包括但不限于
Life is short. We use Python
工號: 程序員的夢囈指南
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。