电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:44日期: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 編程
相關文章:
主站蜘蛛池模板: 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 注浆压力变送器-高温熔体传感器-矿用压力传感器|ZHYQ朝辉 | 石家庄律师_石家庄刑事辩护律师_石家庄取保候审-河北万垚律师事务所 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 | 电动百叶窗,开窗器,电动遮阳百叶,电动开窗机生产厂家-徐州鑫友工控科技发展有限公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 | 路斯特伺服驱动器维修,伦茨伺服驱动器维修|万骏自动化百科 | 硬齿面减速机_厂家-山东安吉富传动设备股份有限公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 伺服电机_直流伺服_交流伺服_DD马达_拓达官方网站 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 深圳市万色印象美业有限公司| 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 土壤墒情监测站_土壤墒情监测仪_土壤墒情监测系统_管式土壤墒情站-山东风途物联网 | 混合生育酚_醋酸生育酚粉_琥珀酸生育酚-山东新元素生物科技 | 陕西安闸机-伸缩门-车牌识别-广告道闸——捷申达门业科技 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 上海道勤塑化有限公司 | 韦伯电梯有限公司 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 |