gpt4 book ai didi

python - 不允许 os.setsid 操作

转载 作者:行者123 更新时间:2023-11-28 16:36:18 28 4
gpt4 key购买 nike

好吧,请耐心等待,谷歌上似乎有一些关于这个的答案,但我就是找不到。

我在 Django Celery 环境中经过两次 fork 后运行它。我不知道这些是否可以改变某些东西,但我认为它们没有。

没有太多的代码可以留下来作为一个强大的

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

授予我不允许的美丽操作

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

最佳答案

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() 失败的唯一原因是调用进程已经是进程组组长。因此:您可以忽略失败。要验证情况是否如此,请比较当 os.setsid() 失败时从 getpid()getpgid() 返回的内容:

#!/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

请注意,进程 ID (pid) 等于进程组 ID (pgid),这意味着该进程确实已经是进程组组长。

P.S:是的,python 的一个令人困惑的特性是引发异常,其中一个简单的错误返回代码就足以区分成功与失败(就像熟悉的 Un*x libc APIs表现)。不幸的是,这就是 python 系统调用接口(interface)的实现方式,因此您需要使用 try: except ...: 构造来包装许多系统调用,以防止 python 中止您的代码。/p>

关于python - 不允许 os.setsid 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25701333/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com