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

时间:2018-11-02 16:18:06

标签: python linux python-3.x daemon start-stop-daemon

我用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仍然可以成功执行(正如我在日志中看到的那样),但是我无权访问它打印到stdout的内容。

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

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

2 个答案:

答案 0 :(得分:1)

从问题的标题来看,如果是尝试stdout访问, 如果该过程有终端,则是可能的。被妖魔化时,没有终端。

答案 1 :(得分:0)

我自己解决了。问题在于,start-stop-daemon在与EINFO_QUIET标志一起运行时正在设置环境变量--quite(手册页中没有记录...)。

OpenRC初始化脚本随后在设置此变量时不输出任何内容到stdout。一个简单的

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

解决了问题。