Python subprocess popen 立即启动

0 投票
2 回答
693 浏览
提问于 2025-04-18 13:03

我的目标是能够在一个单独的进程中启动一个shell脚本,并通过Linux的ptrace系统调用来检查它。问题是,我需要在这个进程启动之前就获取它的进程ID(PID)。像subprocess.Popen(['ls', '-l'])或者python-sh这样的命令会立即运行,所以当我试图通过PID去检查这个进程时,它很可能已经结束了。另一方面,我不能使用os.fork加exec,因为我启动的bash命令会覆盖掉Python代码。

2 个回答

2

你可以先复制一个进程(fork),然后在执行新的命令之前,调用 ptrace() 并传入 PTRACE_TRACEME,这样新的命令就不会立刻开始执行。这给了父进程足够的时间来准备,之后再告诉子进程继续执行(可以用 PTRACE_CONTPTRACE_SYSCALLPTRACE_SINGLESTEP)。

如果你使用 subprocess.Popen(),可以利用 preexec_fn 这个参数,像 @RuiSilva 提到的那样,来调用 PTRACE_TRACEME

3

如果你在使用Unix系统,我觉得你可以在Popen构造函数中使用preexec_fn这个参数。

根据子进程模块的说明:

如果preexec_fn被设置为一个可调用的对象,那么这个对象会在子进程执行之前被调用。(仅限Unix)

因为它是在子进程中运行的,你可以使用os.getpid()来获取子进程的ID。

撰写回答