Python subprocess popen 立即启动
我的目标是能够在一个单独的进程中启动一个shell脚本,并通过Linux的ptrace系统调用来检查它。问题是,我需要在这个进程启动之前就获取它的进程ID(PID)。像subprocess.Popen(['ls', '-l'])或者python-sh这样的命令会立即运行,所以当我试图通过PID去检查这个进程时,它很可能已经结束了。另一方面,我不能使用os.fork加exec,因为我启动的bash命令会覆盖掉Python代码。
2 个回答
2
你可以先复制一个进程(fork),然后在执行新的命令之前,调用 ptrace()
并传入 PTRACE_TRACEME
,这样新的命令就不会立刻开始执行。这给了父进程足够的时间来准备,之后再告诉子进程继续执行(可以用 PTRACE_CONT
、PTRACE_SYSCALL
或 PTRACE_SINGLESTEP
)。
如果你使用 subprocess.Popen()
,可以利用 preexec_fn
这个参数,像 @RuiSilva 提到的那样,来调用 PTRACE_TRACEME
。
3
如果你在使用Unix系统,我觉得你可以在Popen构造函数中使用preexec_fn
这个参数。
根据子进程模块的说明:
如果
preexec_fn
被设置为一个可调用的对象,那么这个对象会在子进程执行之前被调用。(仅限Unix)
因为它是在子进程中运行的,你可以使用os.getpid()
来获取子进程的ID。