从Python生成进程

37 浏览
0 Comments

从Python生成进程

我正在从Web应用程序中生成一个长时间运行的脚本,代码如下:

os.spawnle(os.P_NOWAIT, "../bin/producenotify.py", "producenotify.py", "xx",os.environ)

脚本成功生成并运行,但在它结束之前,我无法释放Web应用程序使用的端口,换句话说,无法重新启动Web应用程序。如何生成一个完全独立于Web应用程序的进程?

这是在Linux操作系统上。

0
0 Comments

问题的出现原因是在Linux系统中,脚本需要自己成为一个独立的进程(即守护进程)。解决方法是根据给出的recipe,使用os.fork和os.exec函数来实现守护进程的创建和运行。

在Linux系统中,将脚本作为守护进程运行是很常见的需求。守护进程是一种后台运行的进程,它不依赖于任何终端会话。在Python中,可以使用os.fork和os.exec函数来创建和运行守护进程。

首先,需要在脚本中使用os.fork函数来创建一个子进程。子进程会继承父进程的环境变量和工作目录。然后,使用os.setsid函数将子进程变为一个新的会话组的组长,这样子进程就不会受到终端会话的影响。

接下来,再次使用os.fork函数创建孙子进程。这样,子进程就可以退出,而孙子进程可以继续运行作为守护进程。为了确保孙子进程独立于父进程,需要关闭所有打开的文件描述符,并将标准输入、标准输出和标准错误重定向到/dev/null。

最后,使用os.execv函数执行守护进程的可执行文件。如果执行失败,守护进程将退出。

以上是一个简化的守护进程创建和运行的代码示例。这个代码可以在父进程中调用,用于生成一个守护进程子进程。代码中可以根据需要进行修改,建议阅读原始recipe和相关文档获取更多信息。

另外,某些情况下想要在函数结束时返回守护进程的PID,可以在函数的最后返回pid变量。还有人问到为什么有两个连续的raise语句,这可能是一个错误,第二个raise语句可能永远不会执行。还某些情况下在应用程序中使用这段代码时,第一个子进程会变成僵尸进程。可以在return语句之前插入os.waitpid(pid, 0)来解决这个问题。

总之,通过使用os.fork和os.exec函数,可以在Python中实现守护进程的创建和运行。守护进程是一种后台运行的进程,不依赖于任何终端会话。有了守护进程,可以实现脚本的独立运行,并且可以保持与父进程相同的工作目录和环境变量。

0
0 Comments

问题的原因是在使用multiprocessing库来生成进程时,主进程不能被终止直到子进程完成。为了解决这个问题,可以将子进程标记为守护进程(daemon)。

以下是一种解决方法:

from multiprocessing import Process
def f(name):
    print 'hello', name
if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.daemon = True
    p.start()
    p.join()

这样,如果父进程(非守护进程)终止,子进程会立即被终止。

另外,可以尝试在`f()`函数中调用`os.setsid()`,但这并不是一个有效的解决方法。

总之,通过将子进程标记为守护进程,可以解决主进程无法终止直到子进程完成的问题。

0