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

您的位置:首頁技術文章
文章詳情頁

解決python subprocess參數shell=True踩到的坑

瀏覽:54日期:2022-06-21 15:03:33
0x01 問題現象

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

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

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

判斷子進程是否運行結束,程序在子進程運行結束后,代碼未向下繼續運行,而是卡在了這個循環中。

0x02 原因分析

百度后對shell參數的解釋如下:

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

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

解決python subprocess參數shell=True踩到的坑

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

解決python subprocess參數shell=True踩到的坑

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

1.1 踩坑案例

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

a. 多線程的網絡通信包處理

和控制Master節點交互

有固定Listen端口

b. 定期作業任務, 通過subprocess.Pipe執行shell命令

c. etc

發現坑的過程很有意思:

a.重啟Agent發現Port被占用了

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

=> 排除發現不是, Agent進程確實死亡了

=> 通過 netstat -tanop|grep port_number 發現端口確實有人占用

=> 調試環境, 直接殺掉占用進程了之, 錯失首次發現問題的機會

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

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

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

=> review該腳本并沒有進行端口監聽的代碼

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

=> 溯源該腳本,發現確實是Agent啟動的任務中的腳本之一

=> 問題基本定位, 該腳本屬于Agent調用的腳本

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

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

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

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

1.2 填坑解法

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

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

表面正常:

啟用新線程執行該腳本

如果出現問題,執行超時防止hang住其他任務執行調用terminate殺死進程

深層問題:

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

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

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

1.4 坑后擴展1.4.1 擴展知識

本節擴展知識包括二個部分:

Linux系統中, 子進程一般會繼承父進程的哪些信息

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

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

1.4.1 技術關鍵字

Linux系統進程

Linux隨機端口選擇

程序多線程執行

Shell執行

1.5 填坑總結

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

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

listened port

opened fd

etc

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

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

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
九九精品调教| 69堂精品视频在线播放| 久久男人av| 欧美日韩99| 偷拍精品精品一区二区三区| 捆绑调教美女网站视频一区 | 亚洲免费资源| 国产一区二区视频在线看| 国产一区二区三区自拍| 亚洲精品系列| 精品国产欧美日韩一区二区三区| 97精品97| 蜜臀精品一区二区三区在线观看| 国产精品入口久久| 欧美sss在线视频| 亚洲资源在线| 成人国产精品| 亚洲精品系列| 精品中文字幕一区二区三区 | 国产精品日韩久久久| 国产欧美91| 黄色成人91| 亚洲欧美一区在线| 亚洲一区日韩| 国产调教精品| 肉色欧美久久久久久久免费看| 日韩精品国产精品| 日韩大片免费观看| 日韩激情av在线| 久久精品国语| 免费在线亚洲| 丝袜a∨在线一区二区三区不卡 | 91嫩草亚洲精品| 日韩区一区二| 欧美一级精品| 久久不见久久见中文字幕免费| 亚洲va中文在线播放免费| 亚洲欧洲专区| 婷婷成人在线| 国产精品第十页| 水蜜桃久久夜色精品一区的特点| 国产一区一一区高清不卡| 蜜臀久久久99精品久久久久久| 色在线视频观看| 国产情侣久久| 首页亚洲欧美制服丝腿| 成人精品中文字幕| 欧美精品导航| 日韩精品一区二区三区中文 | 日韩精品一区二区三区免费观影 | 日韩午夜黄色| 久久电影tv| 国产精品视频一区二区三区四蜜臂| 欧美日韩国产精品一区二区亚洲| 久久免费精品| 热久久久久久| 亚洲影视一区| 夜夜嗨网站十八久久| 日韩欧美精品| 国产一区二区三区四区五区传媒| 最新亚洲国产| 精品1区2区3区4区| 成人羞羞在线观看网站| 日韩av一区二| 日韩一区自拍| 久久国产欧美日韩精品| 亚洲黄色影院| 首页国产精品| 欧美日韩1区| 在线亚洲观看| 日韩在线播放一区二区| 久久精品国产网站| 麻豆精品久久| 麻豆久久久久久久| 久久av电影| 日韩精选在线| 中文字幕成人| 一区二区国产在线| 欧美专区18| 中文精品视频| 亚洲少妇自拍| 久久国产福利| 亚洲综合丁香| 欧美专区18| 丝袜国产日韩另类美女| 国产视频一区在线观看一区免费| 欧美日韩精品一本二本三本| 日本美女一区| 精精国产xxxx视频在线播放| 在线天堂中文资源最新版| 欧美激情麻豆| 国产精品美女久久久久久不卡| 欧美日韩在线精品一区二区三区激情综合 | 国产综合亚洲精品一区二| 久久国产小视频| 亚洲午夜精品久久久久久app| 少妇久久久久| 美女网站一区| 不卡在线一区二区| av不卡在线看| 中文字幕视频精品一区二区三区 | 欧美日本久久| 国产精品欧美大片| 精品久久免费| 国产高清不卡| 精品中文一区| 亚洲在线久久| 国产亚洲一区二区三区不卡| 国产欧美一区二区精品久久久| 国产精品久久久久久久久久齐齐| 久久精品资源| 日韩久久一区二区三区| 日韩中文在线电影| 在线亚洲观看| 日本成人在线视频网站| 国产精品jk白丝蜜臀av小说| 国产一区日韩| 久久影院一区| 日韩制服丝袜av| 欧美亚洲综合视频| 精品亚洲a∨| 久久激情网站| 亚洲丝袜啪啪| 久久国产精品美女| 日韩国产欧美| 亚洲在线观看| 国产美女久久| 精品一区二区三区的国产在线观看 | 欧美搞黄网站| 黄色日韩精品| 99视频+国产日韩欧美| 国产农村妇女精品一二区| 爽好久久久欧美精品| 亚洲另类黄色| 久久狠狠久久| 老牛国内精品亚洲成av人片| 在线视频亚洲| 99亚洲精品| 欧美日韩伊人| 久久久久中文| 日韩中文av| 国产资源在线观看入口av| 午夜久久美女| 国产精品网在线观看| 国产一区二区中文| 欧美亚洲专区| 欧美亚洲国产精品久久| 亚洲综合三区| 国产日韩1区| 国产精品xx| 黑丝一区二区| 911精品国产| 国产粉嫩在线观看| 在线日韩电影| 亚洲精品福利| 成人在线黄色| 中文一区在线| 国产精品久久乐| 日韩毛片在线| 蜜桃久久久久久久| 国产精品视频首页| 欧美日韩在线二区| 日韩激情中文字幕| 国产精品久久观看| 国产精品日本| 国产精品啊v在线| 极品日韩av| 欧美日本一区| 深夜视频一区二区| 亚洲精品女人| 欧美日韩在线观看首页| 美美哒免费高清在线观看视频一区二区| 国产毛片一区二区三区| 久久国产日本精品| 欧美欧美黄在线二区| 999国产精品| 日韩av在线播放中文字幕| 国产精品久久观看| 亚洲久久一区| 日本а中文在线天堂| 综合五月婷婷| 91欧美日韩| 亚洲精品乱码久久久久久蜜桃麻豆 | 中文字幕亚洲在线观看| 精品视频网站| 亚洲一区二区动漫| 色婷婷色综合| 亚洲日本国产| 亚洲精品一级二级| 国产一精品一av一免费爽爽| 久久国产电影| 国产精品探花在线观看| 亚洲特级毛片| 精品五月天堂| 日韩1区2区3区| 今天的高清视频免费播放成人| 久久不见久久见中文字幕免费 | 亚洲精选久久| 久久国产亚洲| 久久精品国产99国产|