亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 解決python subprocess參數shell=True踩到的坑

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

熱門標簽:蓋州市地圖標注 上海機器人外呼系統哪家好 房產電銷外呼系統 南京銷售外呼系統軟件 地圖標注微信發送位置不顯示 地圖標注的意義點 地圖制圖標注位置改變是移位嗎 315電話機器人廣告 浙江電銷卡外呼系統好用嗎

0x01 問題現象

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

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

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

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

0x02 原因分析

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

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

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

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

補充: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=True

1.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實現系統交互(subprocess)
  • Python實現subprocess執行外部命令
  • Python中使用subprocess庫創建附加進程
  • Python中Subprocess的不同函數解析
  • python中subprocess實例用法及知識點詳解

標簽:雙鴨山 陽泉 貴州 臨汾 赤峰 克拉瑪依 金華 日照

巨人網絡通訊聲明:本文標題《解決python subprocess參數shell=True踩到的坑》,本文關鍵詞  解決,python,subprocess,參數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解決python subprocess參數shell=True踩到的坑》相關的同類信息!
  • 本頁收集關于解決python subprocess參數shell=True踩到的坑的相關信息資訊供網民參考!
  • 推薦文章
    国产视频在线免费观看| 免费的黄视频| 精品国产亚洲一区二区三区| 亚洲天堂在线播放| 亚洲爆爽| 九九国产| 精品视频在线看 | 欧美激情伊人| 国产精品自拍在线观看| 精品在线观看一区| 国产伦精品一区三区视频 | 国产原创视频在线| 久久成人亚洲| 国产美女在线一区二区三区| 国产成人精品一区二区视频| 成人免费观看男女羞羞视频| 韩国毛片 免费| 欧美国产日韩一区二区三区| 亚洲精品中文字幕久久久久久| 国产91精品一区二区| 日韩专区亚洲综合久久| 一级女人毛片人一女人| 可以免费看毛片的网站| 精品毛片视频| 欧美激情伊人| 国产一区二区精品尤物| 欧美国产日韩在线| 国产麻豆精品高清在线播放| 国产视频久久久久| 日本伦理片网站| 999久久66久6只有精品| 99色视频在线| 999久久久免费精品国产牛牛| 久久国产影视免费精品| 韩国毛片免费大片| 国产视频一区二区三区四区| 国产麻豆精品免费视频| 免费一级片网站| 欧美爱色| 国产高清视频免费| 精品久久久久久综合网| 亚洲精品永久一区| 精品国产一区二区三区精东影业| 国产成人精品影视| 一级毛片视频播放| 麻豆系列 在线视频| 欧美大片一区| 国产91丝袜在线播放0| 国产一区二区精品| 人人干人人草| 欧美a免费| 日日夜夜婷婷| 黄视频网站在线观看| 欧美大片aaaa一级毛片| 午夜家庭影院| 亚洲不卡一区二区三区在线 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 天天色成人| 国产视频一区二区在线播放| 国产精品自拍亚洲| 久久国产影视免费精品| 欧美日本国产| 国产一区二区高清视频| 国产成人啪精品视频免费软件| 国产伦精品一区二区三区无广告| 国产麻豆精品免费密入口 | 精品视频在线看 | 日韩免费在线观看视频| 999久久66久6只有精品| 香蕉视频亚洲一级| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久草免费在线视频| 免费一级片网站| 九九精品影院| 黄色短视屏| 天天色色网| 欧美日本免费| 色综合久久久久综合体桃花网| 色综合久久天天综线观看| 国产国产人免费视频成69堂| 日本在线www| 欧美激情一区二区三区视频 | 黄视频网站在线观看| 成人在免费观看视频国产| 国产一区精品| 精品视频在线看 | 国产伦精品一区三区视频 | 精品视频在线观看免费| 国产视频一区二区在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品国产一区二区三区免费| 国产国产人免费视频成69堂| 国产91素人搭讪系列天堂| 亚洲天堂一区二区三区四区| 亚洲爆爽| 亚欧乱色一区二区三区| 久久国产影院| 国产激情一区二区三区| 二级片在线观看| 国产亚洲男人的天堂在线观看| 99久久精品费精品国产一区二区| 日本在线www| 日韩欧美一二三区| 精品视频在线观看视频免费视频| 精品久久久久久中文字幕2017| 精品国产三级a| 精品国产亚洲一区二区三区| 亚洲精品影院一区二区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久久国产一久久高清| 精品久久久久久免费影院| 国产成人啪精品| 一级女性大黄生活片免费| 成人免费观看视频| 国产成人啪精品视频免费软件| 黄视频网站免费| 日本伦理黄色大片在线观看网站| 成人高清护士在线播放| 亚洲第一色在线| 精品国产亚洲人成在线| 国产成人精品在线| 欧美激情一区二区三区视频高清| 91麻豆精品国产综合久久久| 国产不卡福利| 久久国产一久久高清| 精品视频一区二区三区| 久久精品免视看国产成人2021| 国产成人精品在线| 成人免费网站视频ww| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品久久久久久免费影院| 日本在线www| 精品视频在线看 | 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 九九免费精品视频| 亚欧成人乱码一区二区| 欧美电影免费| 欧美爱爱动态| 国产一区二区高清视频| 久久99中文字幕| 九九九在线视频| 欧美大片一区| 国产原创视频在线| 九九九在线视频| 99久久精品国产高清一区二区 | 91麻豆精品国产自产在线| 亚洲精品影院久久久久久| 久久成人亚洲| 高清一级片| 香蕉视频三级| 国产成a人片在线观看视频| 成人a级高清视频在线观看| 久久久久久久网| a级毛片免费全部播放| 青草国产在线观看| 一级毛片视频播放| 日韩一级精品视频在线观看| 国产成人精品在线| 日本乱中文字幕系列| 日日日夜夜操| 成人在激情在线视频| 欧美a免费| 香蕉视频三级| 精品久久久久久中文字幕2017| 日韩中文字幕在线播放| 国产一区二区福利久久| 尤物视频网站在线| 九九精品影院| 欧美激情一区二区三区在线播放| 日韩中文字幕在线亚洲一区| 日韩一级精品视频在线观看| 日韩中文字幕一区二区不卡| 精品视频在线观看一区二区| 精品久久久久久中文字幕2017| 高清一级片| 一a一级片| 成人a级高清视频在线观看| 九九久久99| 欧美大片aaaa一级毛片| 成人免费高清视频| 亚洲www美色| 国产视频久久久| 欧美日本免费| 欧美a免费| 欧美大片aaaa一级毛片| 国产不卡福利| 国产成人啪精品| 国产不卡在线看| 精品国产一区二区三区免费| 精品国产一区二区三区国产馆| 日本乱中文字幕系列| 日韩在线观看视频黄| 欧美日本国产| 可以免费看毛片的网站| 国产成人精品在线| 天天色色色| 久草免费在线色站| 免费一级片网站| 久久99这里只有精品国产| 日韩免费在线视频|