2010-02-03 64 views
1

好的,这是一个棘手的问题。我需要启动一个后台进程,它将(1)等待N秒,然后(2)执行一些命令。另外,我需要捕获后台进程本身的pid,因为当父进程结束时它会在必要时终止后台进程。它在外壳语法上看起来有点像这样:如何通过延迟调用在Python中启动后台进程?

(sleep 15 && run_some_cmd) & # launch bg process 
    bg_pid=$!     # capture the bg pid 
    # do some stuff here...  
    kill -9 $bg_pid    # and kill the bg_pid if necessary 

这就是shell中的启动。但是,我试图用Python来做到这一点。棘手的是,因为我需要捕获bg pid,所以我不能使用os.system()或os.fork(),因为在每种情况下父进程都无法访问子进程的pid。我试图让它与subprocess.Popen()一起工作,但考虑到“sleep 15”部分,它有点棘手。

任何想法?

回答

1

当你给shellTruesubprocess.Popen,你执行,只要您在您的示例外壳直接执行,即可以是相同的命令,(sleep 15 && run_some_cmd)应该罚款。

3

我无法使用os.system()或os.fork(),因为在每种情况下父进程都无法访问子进程的pid。

呃,父母从fork()获得pid作为返回值。 无论如何,我会建议使用subprocess模块。它使您可以通过Popen对象的pid属性访问pid。你可以使用os.kill()函数发送一个信号给进程(杀死它)。

最初,我包含了一个评论,“子进程是可取的,因为它适用于Windows和fork()不会”。这几乎立即被删除,因为在子流程模块工作时,os.kill()不会。但是,您也可以通过定义Windows的kill函数来解决此问题,正如建议here和Alex Martelli本人here(有点讽刺地)。因此,现在我可以实际声明,子进程具有更多跨平台的优势,这使它有点酷。当然,如果你对这个问题使用Alex Martelli的答案,那么在Windows上运行的能力会再次下降,因为你依赖于系统shell的特性(当然,cygwin总是一个选项)。