2013-07-19 78 views
1

我一直在這個問題一段時間了,我無法解決它。我正在做子進程,然後這些子進程打開更多進程(實際上是硒webdrivers)。 webdriver很容易崩潰,所以我建立了這個分層系統,以便主進程可以讓子進程,並在需要時殺死/重製它們。無法使用硒線關閉進程

我面對的問題是如果我運行主線程並按Ctrl + C所有的孩子和這些孩子(瀏覽器)的孩子死亡。但是,當我嘗試以編程方式執行此操作時,無論是((Popen)proc).kill(),我都嘗試過SIGINT,SIGTERM。我試過,終止,os.kill,os,killpg。無論我做什麼硒進程都不會死,但是當我按Ctrl + C時,它們都會死亡。

代碼: 以下是我如何製作線程。這怎麼會引起問題?

proc = subprocess.Popen(["python" , module_path() + "/scraper.py"], stdout=subprocess.PIPE ,stdin=subprocess.PIPE)

所以我的主要問題是,有沒有辦法來調用按Ctrl + C效果發生在終端。我最初嘗試使用線程,但他們只是保持死鎖(爲什麼我不知道,他們沒有共享內存,沒有依賴)。 Python不是我的主要語言,任何幫助都是沉澱的。

謝謝。 Kieran

+0

我曾經有同樣的問題,這很容易。你所要做的就是將關閉事件傳遞給firefox瀏覽器,然後傳遞給子進程。如果你不知道,我會在幾個小時後發佈我的答案。 :) – enginefree

回答

1

最後我解決了它。我改變了程序,以便有一個管理員進程和一個子進程。經理產生了幾個孩子,孩子們產生了硒瀏覽器。經理等待孩子崩潰,並且當孩子做了經理殺害殺害硒過程的孩子。

proc = subprocess.Popen(["python" , path + "/pythonChild.py"], preexec_fn=os.setsid, stdout=subprocess.PIPE ,stdin=subprocess.PIPE) 
os.killpg(proc.pid, 9) 

上面的代碼只會使它並殺死它,但通過增加它啓動一個新的進程組,則可以終止其殺死所有兒童preexec。

希望這可以幫助別人!

+0

而不是創建中間Python腳本,您可以在scraper上使用'preexec_fn = os.setsid'來創建一個新會話,然後'os.killpg(proc.pid,signal.SIGKILL)'(發送信號給進程組'proc.pid')也應該殺死所有的後代。 'Ctrl + C'只是'SIGINT'。一個shell爲每個管道創建一個單獨的進程組。 – jfs