我正在开发一个很好的小功能。
def startProcess(name, path):
"""
Starts a process in the background and writes a PID file
returns integer: pid
"""
# Check if the process is already running
status, pid = processStatus(name)
if status == RUNNING:
raise AlreadyStartedError(pid)
# Start process
process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', shell=True)
# Write PID file
pidfilename = os.path.join(PIDPATH, name + '.pid')
pidfile = open(pidfilename, 'w')
pidfile.write(str(process.pid))
pidfile.close()
return process.pid
问题是 process.pid
不是正确的PID。似乎它总是比正确的PID低1。例如,它说进程开始于31729,但是...。ps
说它运行在31730。每次我试过,它都会偏离1,我猜测它返回的PID是PID的 当前 进程,而不是已启动的进程,而且新进程得到的是比它高1的 "下一个 "pid。如果是这样的话,我就不能只依靠返回的 process.pid + 1
因为我不能保证它永远是正确的。
为什么不 process.pid
返回新进程的PID,如何才能实现我想要的行为?
从文档中可以看到 http:/docs.python.orglibrarysubprocess.html。:
Popen.pid 子进程的进程ID。
请注意,如果你将shell参数设置为True,那么这就是被产卵的shell的进程ID。
如果 shell
是假的,我想,它应该会按照你的期望行事。
如果你依靠的是 shell
被 True
用来解析可执行路径的 PATH
环境变量,你也可以通过使用 shutil.which
代替,然后把绝对路径传递给 Popen。(另外,如果您使用的是 Python 3.5 或更新的版本,您应该使用 subprocess.run
而不是波本。