subprocess.popen.kill殺死所有子進程

使用subprocess模塊可創建子進程。

subprocess. Popen ( args , bufsize=0 , executable=None , stdin=None , stdout=None , stderr=None , preexec_fn=None , close_fds=False , shell=False , cwd=None , env=None , universal_newlines=False , startupinfo=None , creationflags=0 )

 

subprocess.Popen(['google-chrome',"http://www.baidu.com"])可打開chrome並顯示百度網頁。

subprocess.Popen.pid可顯示子進程的id,但這只是打開的shell的id,如果此時使用pid.kill是無法殺掉所有子進程的。

 

 

殺掉所有子進程,代碼:

import sys, os, subprocess, time, signal
p = subprocess.Popen(['google-chrome',"http://www.baidu.com"], close_fds=True, preexec_fn = os.setsid)
print p.pid 
time.sleep(5)
# p.kill() #無法殺掉所有子進程,只能殺掉子shell的進程

# p.terminate()  #無法殺掉所有子進程
os.killpg( p.pid,signal.SIGUSR1)

time.sleep(3)

 

 

注意:

close_fds=True,此時除了文件描述符爲0 , 1 and 2,其他子進程都要被殺掉。( Linux中所有的進程都是進程0的子進程。

pid=1的是init,內核完成之後啓動的第一個進程,然後init根據/etc/inittab的內容再去啓動其它進程。)

os.setsid(): 使獨立於終端的進程(不響應sigint,sighup等),使脫離終端。

SIGUSR1: 用戶自定義信號

os.killpg( p.pid,signal.SIGUSR1): 發送SIGUSR1信號到組進程p.pid

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章