用Popen打开一个进程并获得PID

时间:2011-11-03 03:22:19

标签: python subprocess popen

我正在研究一个漂亮的小功能:

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当前的进程,而不是已启动的进程,新进程获得的“下一个”pid高1。如果是这种情况,我不能仅仅依靠返回process.pid + 1,因为我无法保证它始终是正确的。

为什么process.pid没有返回新进程的PID,我怎样才能实现我之后的行为?

1 个答案:

答案 0 :(得分:27)

来自http://docs.python.org/library/subprocess.html的文档:

  

Popen.pid子进程的进程ID。

     

请注意,如果将shell参数设置为True,则这是进程   生成的shell的ID。

如果shell为假,我认为它应该按照您的预期行事。