我用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)
的输出现在为空。
答案 0 :(得分:1)
从问题的标题来看,如果是尝试stdout访问, 如果该过程有终端,则是可能的。被妖魔化时,没有终端。
答案 1 :(得分:0)
我自己解决了。问题在于,start-stop-daemon
在与EINFO_QUIET
标志一起运行时正在设置环境变量--quite
(手册页中没有记录...)。
OpenRC初始化脚本随后在设置此变量时不输出任何内容到stdout。一个简单的
import os
os.environ["EINFO_QUIET"] = "NO"
解决了问题。