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"
解决问题。
我在 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"
解决问题。