python subprocess popen立即启动

时间:2014-07-12 07:53:27

标签: python linux process

我的目标是能够在单独的进程中启动shell脚本并通过linux ptrace syscall进行检查。 问题是我需要在它开始之前获得进程PID。像subprocess.Popen(['ls',' - l'])或python-sh这样的东西会立即运行命令,所以在我试图通过它的PID检查这个过程时,它很可能就完成了。 另一方面,我不能使用os.fork + exec因为bash命令我开始覆盖python代码。

2 个答案:

答案 0 :(得分:3)

如果您正在使用Unix,我认为您可以在Popen构造函数中使用preexec_fn参数。

根据子流程文档:

  

如果preexec_fn设置为可调用对象,则在子进程执行之前,将在子进程中调用此对象。 (仅限Unix)

当它在子进程中运行时,您可以使用os.getpid()来获取子进程。

答案 1 :(得分:2)

只需在shell的exec之前用ptrace()调用PTRACE_TRACEME,这样exec就不会立即启动,在父母告诉孩子之前给父母一直需要准备的时间继续(PTRACE_CONTPTRACE_SYSCALLPTRACE_SINGLESTEP)。

使用subprocess.Popen()时,您可以使用@RuiSilva提到的preexec_fn参数进行PTRACE_TRACEME调用。