Linux 下 popen 函式引起的殭屍程式 defunct 以及解決辦法

Joe_vv發表於2014-03-27

        在使用 popen 函式的時候,如果不注意的話,可能會引起殭屍程式 defunct 的存在,雖然該程式不佔用記憶體和 CPU,但是會在程式任務管理樹上佔用一個寶貴的節點。這樣就造成了程式名額的資源浪費,所以一定得處理殭屍程式!

 

下面以 python 為例來說明:

python 指令碼如下(zombie.py):

#!/usr/bin/env python
#-*-encoding:UTF-8-*-

import os
import time
import subprocess


if __name__ == '__main__':
    p = subprocess.Popen('ls',shell=True,close_fds=True,bufsize=-1,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    file =  p.stdout.readlines()

    for i in range(0, len(file)):
        print file[i]
    #end for


    while True:
        time.sleep(1)
    #end while
#end if


執行結果如下:

 

我們用 top 命令檢視此時有沒有殭屍程式,結果如下:

 

用 ps axf 命令檢視具體的殭屍程式,結果如下:

 

檢視相關資料後發現,在使用 popen 函式後,需要呼叫 wait 函式(等待子程式中斷或結束),否則就會產生殭屍程式,於是上面的程式碼做了簡單修改

#!/usr/bin/env python
#-*-encoding:UTF-8-*-

import os
import time
import subprocess


if __name__ == '__main__':
    p = subprocess.Popen('ls',shell=True,close_fds=True,bufsize=-1,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
    file =  p.stdout.readlines()
    p.wait()     # 新增 wait 函式

    for i in range(0, len(file)):
        print file[i]
    #end for


    while True:
        time.sleep(1)
    #end while
#end if


執行結果不變,但是使用 top 名令檢視殭屍程式的個數,結果如下:


 

使用 ps axf 命令檢視結果如下:

並無殭屍程式。

 

介紹下 wait() 函式的功能:

 wait() 會暫時停止目前程式的執行,直到有訊號來到或子程式結束。如果在呼叫 wait() 時子程式已經結束,則 wait() 會立即返回子程式結束狀態值。子程式的結束狀態值會由引數 status 返回,而子程式的程式識別碼也會一快返回。

 

有些資料也說 waitpid() 函式也可以解決該問題,我沒有去嘗試,有興趣的朋友可以嘗試一下,也希望一起分享結果。

 

參考:

http://www.csdn123.com/html/blogs/20130619/23994.htm

http://zhiwei.li/text/2010/05/python-%E9%87%8C%E7%94%A8subprocess%E7%9A%84-popen-%E6%9D%A5%E5%86%99webshell/

 


博主所有文章已轉自私人部落格 Joe 的個人部落格,謝謝關注!

相關文章