日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

解決python subprocess參數(shù)shell=True踩到的坑

瀏覽:50日期:2022-06-21 15:03:33
0x01 問題現(xiàn)象

寫的程序使用subprocess創(chuàng)建子進程運行其他程序,判斷其他程序運行完后進行處理。

在subprocess使用了shell=True,判斷用戶程序退出的代碼如下

while self.proc.poll() is None: do_something

判斷子進程是否運行結(jié)束,程序在子進程運行結(jié)束后,代碼未向下繼續(xù)運行,而是卡在了這個循環(huán)中。

0x02 原因分析

百度后對shell參數(shù)的解釋如下:

shell=True參數(shù)會讓subprocess.Popen接受字符串類型的變量作為命令,并調(diào)用shell去執(zhí)行這個字符串,當shell=False是,subprocess.Popen只接受數(shù)組變量作為命令,并將數(shù)組的第一個元素作為命令,剩下的全部作為該命令的參數(shù)。

通過查看服務(wù)器進程可以看到,仍然有進程存在,進程如下

解決python subprocess參數(shù)shell=True踩到的坑

為shell中運行的程序,由此可以得出,shell=true時,子進程在運行完后,shell并沒有退出,而是卡在shell命令中,可由進程看到。

解決python subprocess參數(shù)shell=True踩到的坑

補充:Python踩坑之旅其一殺不死的Shell子進程

1.1 踩坑案例

踩坑的程序是個常駐的Agent類管理進程, 包括但不限于如下類型的任務(wù)在執(zhí)行:

a. 多線程的網(wǎng)絡(luò)通信包處理

和控制Master節(jié)點交互

有固定Listen端口

b. 定期作業(yè)任務(wù), 通過subprocess.Pipe執(zhí)行shell命令

c. etc

發(fā)現(xiàn)坑的過程很有意思:

a.重啟Agent發(fā)現(xiàn)Port被占用了

=> 立刻想到可能進程沒被殺死, 是不是停止腳本出問題

=> 排除發(fā)現(xiàn)不是, Agent進程確實死亡了

=> 通過 netstat -tanop|grep port_number 發(fā)現(xiàn)端口確實有人占用

=> 調(diào)試環(huán)境, 直接殺掉占用進程了之, 錯失首次發(fā)現(xiàn)問題的機會

b.問題在一段時間后重現(xiàn), 重啟后Port還是被占用

定位問題出現(xiàn)在一個叫做xxxxxx.sh的腳本, 該腳本占用了Agent使用的端口

=> 奇了怪了, 一個xxx.sh腳本使用這個奇葩Port干啥(大于60000的Port, 有興趣的磚友可以想下為什么Agent默認使用6W+的端口)

=> review該腳本并沒有進行端口監(jiān)聽的代碼

一拍腦袋, c.進程共享了父進程資源了

=> 溯源該腳本,發(fā)現(xiàn)確實是Agent啟動的任務(wù)中的腳本之一

=> 問題基本定位, 該腳本屬于Agent調(diào)用的腳本

=> 該Agent繼承了Agent原來的資源FD, 也就是這個port

=> 雖然該腳本由于超時被動觸發(fā)了terminate機制, 但terminate并沒有干掉這個子進程

=> 該腳本進程的父進程(ppid) 被重置為了1

d.問題****出在腳本進程超時kill邏輯

1.2 填坑解法

通過代碼review, 找到shell具體執(zhí)行的庫代碼如下:

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=True1.3 坑位分析

Agent會在一個新創(chuàng)建的threading線程中執(zhí)行這段代碼, 如果線程執(zhí)行時間超時(xx seconds), 會調(diào)用 self._subpro.terminate()終止該腳本.

表面正常:

啟用新線程執(zhí)行該腳本

如果出現(xiàn)問題,執(zhí)行超時防止hang住其他任務(wù)執(zhí)行調(diào)用terminate殺死進程

深層問題:

Python 2.7.x中subprocess.Pipe 如果shell=True, 會默認把相關(guān)的pid設(shè)置為shell(sh/bash/etc)本身(執(zhí)行命令的shell父進程), 并非執(zhí)行cmd任務(wù)的那個進程

子進程由于會復(fù)制父進程的opened FD表, 導(dǎo)致即使被殺死, 依然保留了擁有這個Listened Port FD

這樣雖然殺死了shell進程(未必死亡, 可能進入defunct狀態(tài)), 但實際的執(zhí)行進程確活著. 于是1.1中的坑就被結(jié)實的踩上了.

1.4 坑后擴展1.4.1 擴展知識

本節(jié)擴展知識包括二個部分:

Linux系統(tǒng)中, 子進程一般會繼承父進程的哪些信息

Agent這種常駐進程選擇>60000端口的意義

擴展知識留到下篇末尾講述, 感興趣的可以自行搜索

1.4.1 技術(shù)關(guān)鍵字

Linux系統(tǒng)進程

Linux隨機端口選擇

程序多線程執(zhí)行

Shell執(zhí)行

1.5 填坑總結(jié)

1.子進程會繼承父進程的資源信息

2.如果只kill某進程的父進程, 集成了父進程資源的子進程會繼續(xù)占用父進程的資源不釋放, 包括但不限于

listened port

opened fd

etc

3.Python Popen使用上, shell的bool狀態(tài)決定了進程kill的邏輯, 需要根據(jù)場景選擇使用方式

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99免费精品| 六月天综合网| 久久香蕉精品香蕉| 成人污污视频| 久久精品高清| av高清一区| 国产亚洲毛片| 国产欧美亚洲精品a| 成午夜精品一区二区三区软件| 国产精品成人a在线观看| 欧美二三四区| 在线国产精品一区| 麻豆精品一区二区综合av| 日韩高清欧美| 免费成人av在线播放| 国产精品九九| 婷婷亚洲五月色综合| 日本亚州欧洲精品不卡| 免费日韩成人| 久久国产欧美| 免费观看在线色综合| 国产福利一区二区精品秒拍| 日本欧美一区二区| 国产精品毛片| 成人羞羞在线观看网站| 欧美日韩一二三四| 一区二区三区网站| 亚洲天堂av资源在线观看| 一区免费在线| 亚洲精品乱码| 国产精品99久久久久久董美香| 欧洲亚洲一区二区三区| 亚洲精品一区三区三区在线观看| 成人精品天堂一区二区三区| 日韩在线黄色| 国产欧美欧美| 国产一区成人| 久久国产亚洲| 午夜久久福利| 国产精品麻豆成人av电影艾秋 | 麻豆视频在线看| 日韩在线观看一区| av高清一区| 亚洲特色特黄| 久久在线免费| 国产精品第一| 欧美~级网站不卡| 亚洲午夜国产成人| 老司机精品在线| 午夜天堂精品久久久久| 国产精品日本一区二区不卡视频| 国产伦精品一区二区三区千人斩 | 亚洲欧美日韩精品一区二区 | 99久久亚洲精品| 国产精品最新| 亚州av一区| 丝袜美腿亚洲一区二区图片| 日韩毛片视频| 精品视频免费| 91av一区| 亚洲1区在线观看| 美女国产精品| 国产精品毛片| 午夜视频精品| 国产一区日韩一区| 韩国三级一区| 色偷偷色偷偷色偷偷在线视频| 91嫩草精品| 色狠狠一区二区三区| 天堂成人免费av电影一区| 国产一区亚洲| 四虎影视精品| 日韩高清欧美| bbw在线视频| 久久精品一区二区三区中文字幕| **爰片久久毛片| 日韩黄色免费网站| 综合色一区二区| 自拍自偷一区二区三区| 国产亚洲一级| 国产亚洲毛片| 亚洲少妇诱惑| 亚洲视频www| 黄色在线一区| 午夜在线视频观看日韩17c| 日韩一区二区久久| 亚洲综合国产| 丝袜脚交一区二区| 日韩精品一二三四| 亚洲精品美女| 日韩精品久久久久久久软件91| 视频国产精品| 久久精品xxxxx| 麻豆视频一区二区| 激情综合五月| 日韩中文字幕高清在线观看| 久久蜜桃精品| 亚洲黑丝一区二区| 日韩午夜在线| 视频一区日韩精品| 国产色噜噜噜91在线精品| 国产精品天天看天天狠| 嫩草伊人久久精品少妇av杨幂| 久久亚洲国产精品尤物| 四虎8848精品成人免费网站| 久久精品成人| 鲁大师成人一区二区三区| 日本不卡一区二区| 精品国产亚洲一区二区三区在线| 国产精品99一区二区三| 国产在线不卡| 最新亚洲国产| 欧美久久一区二区三区| 美腿丝袜在线亚洲一区| 久久久久99| 日韩精品一二三区| 国产精品99久久免费| 欧美日韩免费看片| 午夜在线一区| 国产亚洲精品美女久久| 激情国产在线| 99香蕉国产精品偷在线观看| 日本精品另类| 国产激情在线播放| 九九久久电影| 日韩精品一区二区三区中文| 久久久久观看| 91精品国产调教在线观看 | 日韩在线看片| 日韩精品一二三区| 麻豆一区二区99久久久久| 亚洲午夜电影| 国产亚洲欧美日韩精品一区二区三区 | 欧美日韩高清| 国产精品香蕉| 在线国产一区二区| 欧美黄色一区| 亚洲国产不卡| 国产精品网址| 午夜免费一区| 国产伦精品一区二区三区千人斩| 日本午夜大片a在线观看| 综合欧美亚洲| 亚洲人成在线网站| 一级欧美视频| 欧美国产另类| 亚洲综合精品四区| 狠狠久久伊人| 日韩一区二区三区四区五区| 成人日韩精品| 国产毛片久久久| 另类激情亚洲| 日韩免费福利视频| 国产精品午夜av| 免费人成黄页网站在线一区二区| 精品久久网站| 欧美亚洲一级| 亚洲在线免费| 日韩免费福利视频| 国产精品久久久免费| 伊人精品视频| 日韩大片在线播放| 国产精品久久久久久久久久齐齐| 一本一道久久a久久精品蜜桃| 精品日产乱码久久久久久仙踪林| 四虎精品永久免费| 欧美日韩国产欧| 日韩黄色大片网站| 麻豆中文一区二区| 天堂久久av| 亚洲在线成人| 99精品网站| 日本不卡免费高清视频在线| 欧美欧美黄在线二区| 久久国产精品亚洲77777| 日本一区二区高清不卡| 国产精品白浆| 欧美一区久久| 亚洲精品日韩久久| 国产亚洲永久域名| 91精品91| 亚洲精品网址| 欧美.日韩.国产.一区.二区 | 免费久久99精品国产| 欧美+亚洲+精品+三区| 欧美三级网址| 久久伊人国产| 国产精品极品在线观看| 日韩福利在线观看| 日韩av字幕| 欧美一级久久| 欧美日韩91| 国产精品久久久久毛片大屁完整版 | 国产一区 二区| 日韩不卡一二三区| 91欧美极品| 国产精品任我爽爆在线播放| 国产精品亲子伦av一区二区三区 | 青青国产精品| 国产日韩欧美一区在线|