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