婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

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

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

0x01 問題現(xiàn)象

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

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

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

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

0x02 原因分析

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

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

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

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

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

1.1 踩坑案例

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

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

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

有固定Listen端口

b. 定期作業(yè)任務, 通過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)端口確實有人占用

=> 調試環(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啟動的任務中的腳本之一

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

=> 該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=True

1.3 坑位分析

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

表面正常:

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

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

深層問題:

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

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

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

1.4 坑后擴展

1.4.1 擴展知識

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

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

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

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

1.4.1 技術關鍵字

Linux系統(tǒng)進程

Linux隨機端口選擇

程序多線程執(zhí)行

Shell執(zhí)行

1.5 填坑總結

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

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

listened port

opened fd

etc

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

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

您可能感興趣的文章:
  • Python實現(xiàn)系統(tǒng)交互(subprocess)
  • Python實現(xiàn)subprocess執(zhí)行外部命令
  • Python中使用subprocess庫創(chuàng)建附加進程
  • Python中Subprocess的不同函數(shù)解析
  • python中subprocess實例用法及知識點詳解

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

巨人網(wǎng)絡通訊聲明:本文標題《解決python subprocess參數(shù)shell=True踩到的坑》,本文關鍵詞  解決,python,subprocess,參數(shù),;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解決python subprocess參數(shù)shell=True踩到的坑》相關的同類信息!
  • 本頁收集關于解決python subprocess參數(shù)shell=True踩到的坑的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国内精品免费在线观看| 久久综合色天天久久综合图片| 成人午夜av在线| 欧美日韩mp4| 日韩成人一级大片| 5566中文字幕一区二区电影| 同产精品九九九| 7777女厕盗摄久久久| 亚洲国产日韩a在线播放| 欧美中文一区二区三区| 亚洲精品免费一二三区| 欧美在线视频不卡| 蓝色福利精品导航| 国产女人18毛片水真多成人如厕 | 国产精品久久综合| 成人激情视频网站| 玉米视频成人免费看| 91精品国产一区二区人妖| 精品一区二区在线播放| 亚洲国产精品高清| 4438成人网| 99精品视频免费在线观看| 三级久久三级久久| 亚洲精品视频一区二区| 精品美女在线播放| 欧美视频一二三区| 成人性色生活片免费看爆迷你毛片| 亚洲视频香蕉人妖| 国产视频一区二区在线| 欧美一区二区三区四区久久| 91精品福利在线| 美日韩一区二区| 亚洲一区中文在线| 中文字幕av在线一区二区三区| 欧美日韩视频在线一区二区| 99麻豆久久久国产精品免费 | 国产乱子伦视频一区二区三区| 亚洲人妖av一区二区| 亚洲欧洲精品天堂一级 | 99久久国产综合精品女不卡| 久久99精品久久只有精品| 亚洲成人一区二区| 精品中文字幕一区二区小辣椒| 久久不见久久见免费视频1| 日韩精品电影一区亚洲| 国产在线精品视频| 一本色道**综合亚洲精品蜜桃冫| 国产99一区视频免费| 99热99精品| 风间由美性色一区二区三区| 精品一区二区三区免费毛片爱| 久久精品99国产精品| 美脚の诱脚舐め脚责91| 国产成人精品一区二| 欧美色偷偷大香| 欧美日本视频在线| 精品88久久久久88久久久| 一区二区三区不卡在线观看 | 国产乱码精品一区二区三区忘忧草 | 国产高清不卡二三区| 一本大道久久a久久综合| 欧美精品一区二区三区高清aⅴ| 欧美国产欧美亚州国产日韩mv天天看完整 | 2欧美一区二区三区在线观看视频| 国产精品激情偷乱一区二区∴| 全国精品久久少妇| 精品视频在线免费观看| 国产日韩av一区| 国内精品写真在线观看| 在线这里只有精品| 亚洲一区在线视频| 99久久久无码国产精品| 国产日韩在线不卡| 欧美日韩亚洲综合一区| 国产精品三级电影| 成人午夜私人影院| 综合激情成人伊人| 91老师国产黑色丝袜在线| 亚洲日本在线看| 91亚洲精品久久久蜜桃| 一区二区三区在线视频观看58| 成人免费视频网站在线观看| 国产精品女同互慰在线看| 国产精品一线二线三线精华| 久久久久久9999| 欧美亚州韩日在线看免费版国语版| 亚洲欧美日韩国产另类专区| 成人av电影在线网| 18成人在线观看| 成人黄页毛片网站| 亚洲免费观看高清完整版在线观看| 97精品国产露脸对白| 天天影视涩香欲综合网 | 精品福利一区二区三区免费视频| 国精产品一区一区三区mba视频| 久久久久久久精| 在线观看网站黄不卡| 国产一区二区日韩精品| 亚洲综合色自拍一区| 久久久蜜桃精品| 在线观看三级视频欧美| 成人看片黄a免费看在线| 国产在线不卡视频| 日韩av电影免费观看高清完整版 | 6080午夜不卡| 在线免费亚洲电影| 91丨porny丨首页| 91在线观看免费视频| 国产制服丝袜一区| 日本欧美久久久久免费播放网| 亚洲人精品午夜| 亚洲一区二区三区精品在线| 一区二区三区国产精品| 亚洲男人的天堂在线aⅴ视频| 有坂深雪av一区二区精品| 夜夜嗨av一区二区三区 | 精品久久人人做人人爽| 亚洲人精品午夜| 日本不卡123| 麻豆精品一二三| 中文字幕中文在线不卡住| 国产成人一级电影| 99精品视频在线观看| 欧美手机在线视频| 欧美国产成人精品| 麻豆成人av在线| 欧美午夜精品久久久久久孕妇| 久久久亚洲精品一区二区三区| 日韩精品一级中文字幕精品视频免费观看 | 日韩一区二区免费电影| 1区2区3区精品视频| 国产.欧美.日韩| 日韩欧美一区在线| 亚洲国产一区二区三区青草影视| 99久久免费国产| 国产精品国产三级国产普通话三级| 国内精品免费**视频| 欧美成人乱码一区二区三区| 免费成人在线播放| 欧美一区二区观看视频| 免费人成精品欧美精品| 欧美男同性恋视频网站| 日韩精品久久久久久| 在线成人免费观看| 亚洲成av人片一区二区梦乃| 欧美剧在线免费观看网站 | 国产精品理论片| eeuss鲁片一区二区三区| 国产精品全国免费观看高清| 国产91高潮流白浆在线麻豆| 国产精品丝袜一区| 一本久久综合亚洲鲁鲁五月天| 一区二区在线免费观看| 欧美性猛交xxxx乱大交退制版| 亚洲综合色丁香婷婷六月图片| 欧美日韩在线三区| 免费在线一区观看| www日韩大片| 99re成人精品视频| 日日摸夜夜添夜夜添国产精品| 欧美变态tickle挠乳网站| 国产一区二区在线视频| 中文字幕在线不卡| 在线观看免费亚洲| 久久国产精品免费| 国产精品高潮呻吟久久| 欧美中文字幕一二三区视频| 美日韩一区二区| 综合激情成人伊人| 欧美一卡二卡在线| 国产成人综合精品三级| 亚洲午夜久久久久久久久久久| 精品国产亚洲在线| 色综合天天综合网天天狠天天| 日韩精品国产欧美| 亚洲精品国产第一综合99久久 | 欧美亚洲综合色| 黄色日韩三级电影| 亚洲永久精品大片| 国产精品网站在线| 欧美精品一区二区精品网| 日本精品一区二区三区高清 | 国产99久久精品| 亚洲欧美日韩中文字幕一区二区三区| 欧美日本一区二区在线观看| 欧美精品久久久久久久多人混战| 久久99国内精品| 亚洲一区二区三区精品在线| 国产蜜臀97一区二区三区| 制服.丝袜.亚洲.另类.中文| 成人免费观看av| 激情偷乱视频一区二区三区| 夜夜亚洲天天久久| 国产精品精品国产色婷婷| 久久久久国产免费免费 | 欧美人妇做爰xxxⅹ性高电影| 成人免费毛片a| 国产成人丝袜美腿| 韩国成人福利片在线播放| 午夜精品久久久久久久久久久|