os.setsid操作不被允许

时间:2014-09-06 14:38:31

标签: python django debian system

好吧,对我来说,谷歌似乎有一些答案,但我根本无法得到它。

我在Django Celery环境中的两个分叉后运行它。我不知道这些是否会改变一些东西,但我认为它们没有改变。

没有太多代码可以作为强大的

离开
if __name__ == '__main__':
    os.setsid()

授予我不允许的美丽行动

我正在运行最新的稳定Django,Debian,Celery和Python版本。

1 个答案:

答案 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中止代码。