2013-07-19 51 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