0

I wrote a RPC server foo in Python that I deamonized with

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

Everything works fine except that every use of subprocess.check_call(some_cmd) or os.popen(some_cmd).read(1048576) in my daemon returns an empty string compared to the case when I start foo in the foreground.

The external program some_cmd is still executed sucessfully (as I can see in the logs), yet I don't have access to the stuff it prints to stdout.

Why is that and what changes can I make to either the start-stop-daemon call or my Python code in ordert to fix this?

PS: I found that only the output of certain commands is now empty: subprocess.check_output('echo "Hello World"', shell=True) still behaves normally, whereas the output of subprocess.check_output('/etc/init.d/apache2 --nocolor reload', shell=True) is now empty.

Simon Fromme
  • 3,104
  • 18
  • 30

2 Answers2

1

From title of problem, if it is an attempt for stdout access, it is possible if there is terminal with the process. When demonised, there is no terminal.

anand
  • 163
  • 7
0

I solved it myself. The problem was that start-stop-daemon is setting the environment variable EINFO_QUIET when run with the --quite flag (not documented in the man pages...).

OpenRC init scripts then prints nothing to stdout when this variable is set. A simple

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

solves the problem.

Simon Fromme
  • 3,104
  • 18
  • 30