deamonizing Python 脚本后无法读取外部命令的 stdout 输出

Can't read stdout output of external commands after deamonizing Python script

我在 Python 中写了一个 RPC 服务器 foo,我用

去魔化了
start-stop-daemon --start --quiet --background \
                  --make-pidfile \
                  --pidfile /var/run/foo.pid \
                  -- /opt/foo

一切正常,除了在我的守护程序中每次使用 subprocess.check_call(some_cmd)os.popen(some_cmd).read(1048576) 与我在前台启动 foo 时相比,都是一个空字符串.

外部程序 some_cmd 仍然成功执行(正如我在日志中看到的那样),但我无法访问它打印到标准输出的内容。

这是为什么?我可以对 start-stop-daemon 调用或我的 Python 代码进行哪些更改才能解决此问题?

PS:我发现只有某些命令的输出现在是空的:subprocess.check_output('echo "Hello World"', shell=True) 仍然表现正常,而 subprocess.check_output('/etc/init.d/apache2 --nocolor reload', shell=True) 的输出现在是空的。

从问题的标题来看,如果是尝试访问stdout, 如果进程有终端,则有可能。魔化后没有终端

我自己解决了。问题是 start-stop-daemon 在 运行 时使用 --quite 标志设置环境变量 EINFO_QUIET(未在手册页中记录...)。

设置此变量后,OpenRC 初始化脚本不会向标准输出打印任何内容。一个简单的

import os
os.environ["EINFO_QUIET"] = "NO"

解决问题。