使用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