我的目标是能够在单独的进程中启动shell脚本并通过linux ptrace syscall进行检查。 问题是我需要在它开始之前获得进程PID。像subprocess.Popen(['ls',' - l'])或python-sh这样的东西会立即运行命令,所以在我试图通过它的PID检查这个过程时,它很可能就完成了。 另一方面,我不能使用os.fork + exec因为bash命令我开始覆盖python代码。
答案 0 :(得分:3)
如果您正在使用Unix,我认为您可以在Popen构造函数中使用preexec_fn
参数。
根据子流程文档:
如果preexec_fn设置为可调用对象,则在子进程执行之前,将在子进程中调用此对象。 (仅限Unix)
当它在子进程中运行时,您可以使用os.getpid()
来获取子进程。
答案 1 :(得分:2)
只需在shell的exec之前用ptrace()
调用PTRACE_TRACEME
,这样exec就不会立即启动,在父母告诉孩子之前给父母一直需要准备的时间继续(PTRACE_CONT
,PTRACE_SYSCALL
或PTRACE_SINGLESTEP
)。
使用subprocess.Popen()
时,您可以使用@RuiSilva提到的preexec_fn
参数进行PTRACE_TRACEME
调用。