python subprocess使用记录
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
前幾天發(fā)現(xiàn)服務(wù)器上有幾個(gè)zombie進(jìn)程,搜索了一下(ps -ef | grep defunct),僵尸進(jìn)程的父進(jìn)程是以前寫(xiě)的python同步腳本。
仔細(xì)看了下代碼,發(fā)現(xiàn)在這:
sub?=?subprocess.Popen(cmd,?shell=True,?stdout=subprocess.PIPE,?stderr=subprocess.STDOUT) #?other?codes對(duì),父進(jìn)程開(kāi)啟了子進(jìn)程后,并無(wú)任何動(dòng)作,子進(jìn)程執(zhí)行完成后成為一個(gè)僵尸進(jìn)程。
解決方法很簡(jiǎn)單,父進(jìn)程wait子進(jìn)程即可,但因?yàn)闃?biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出是管道方式(PIPE),直接使用wait()有可能會(huì)導(dǎo)致管道堵塞,python官方文檔亦有以下敘述:
WarningThis?will?deadlock?when?using?stdout=PIPE?and/or?stderr=PIPE?and?the?child?process?generates?enough?output?to?a?pipe?such?that?it?blocks?waiting?for?the?OS?pipe?buffer?to?accept?more?data.?Use?communicate()?to?avoid?that.官方建議適用communicate方法,于是修改代碼如下:
另外一種修改方式,適用于不關(guān)心子進(jìn)程返回結(jié)果的場(chǎng)景,可以將STDOUT和STDERR輸出結(jié)果定向到/dev/dull去,再調(diào)用wait()即可,如下:
因?yàn)樾枰舆M(jìn)程的處理信息,選用了第一種方法。重新啟動(dòng)python腳本,不再出現(xiàn)僵尸進(jìn)程的問(wèn)題了。
轉(zhuǎn)載于:https://my.oschina.net/catandpaperball/blog/477184
總結(jié)
以上是生活随笔為你收集整理的python subprocess使用记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows2003 DNS服务器配置
- 下一篇: [LeetCode]题解(python)