好吧,对我来说,谷歌似乎有一些答案,但我根本无法得到它。
我在Django Celery环境中的两个分叉后运行它。我不知道这些是否会改变一些东西,但我认为它们没有改变。
没有太多代码可以作为强大的
离开if __name__ == '__main__':
os.setsid()
授予我不允许的美丽行动
我正在运行最新的稳定Django,Debian,Celery和Python版本。
答案 0 :(得分:3)
Python的os.setsid()
可能调用底层库调用setsid(3)
。
man 3 setsid
中的完整错误部分是:
ERRORS
EPERM The process group ID of any process equals the PID of the call-
ing process. Thus, in particular, setsid() fails if the calling
process is already a process group leader.
IOW:setsid()
失败的唯一原因是调用流程已经是流程组负责人。 Ergo:你可以忽略失败。要验证是否属于这种情况,请在getpid()
失败时比较从getpgid()
和os.setsid()
获得的内容:
#!/usr/bin/env python
import os
import errno
if __name__ == '__main__':
try:
os.setsid()
except OSError, (err_no, err_message):
print "os.setsid failed: errno=%d: %s" % (err_no, err_message)
print "pid=%d pgid=%d" % (os.getpid(), os.getpgid(0))
当我运行以上内容时,我得到:
os.setsid failed: errno=1: Operation not permitted
pid=17025 pgid=17025
请注意,process-id(pid)等于process-group-id(pgid),这意味着此进程确实已经是进程组的领导者。
P.S:是的,python的一个令人困惑的功能是引发异常,其中一个简单的错误返回代码足以区分成功和失败(就像熟悉的Un * x libc
API行为一样)。不幸的是,如何实现python系统调用接口,因此需要使用try: except ...:
结构包装许多系统调用,以防止python中止代码。