Ben Finney <ben+pyt...@benfinney.id.au> writes: > I'm not familiar enough with the nuances of the ‘subprocess’ module to > know what might be going wrong here. I'd like to know whether it might > be a problem in the ‘python-daemon’ library.
My test case for this is now:: ===== #! /usr/bin/python import daemon import os import sys import subprocess fake_console = open("fake_console.txt", "w+") daemon.DaemonContext(stdout=fake_console, stderr=fake_console).open() sys.stdout.write("Parent daemon process.\n") os.system("echo Child process via 'os.system'.") subprocess.Popen(["echo", "Child process via 'subprocess.Popen'."]).wait() sys.stdout.write("Parent daemon process done.\n") ===== causing (in the ‘fake_console.txt’ output file):: ===== Child process via os.system. Child process via 'subprocess.Popen'. Parent daemon process. Traceback (most recent call last): File "/home/bignose/Projects/python/python-daemon/python-daemon.devel/bin/clegg-example", line 13, in <module> subprocess.Popen(["echo", "Child process via 'subprocess.Popen'."]).wait() File "/usr/lib/python2.5/subprocess.py", line 1184, in wait pid, sts = self._waitpid_no_intr(self.pid, 0) File "/usr/lib/python2.5/subprocess.py", line 1014, in _waitpid_no_intr return os.waitpid(pid, options) OSError: [Errno 10] No child processes ===== Ben Finney <ben+pyt...@benfinney.id.au> writes: > Joel Martin <nos...@martintribe.org> writes: > > > I'm running python-2.6.2 which supposedly has the fix for #1731717. > > However I still still the problem with subprocess after daemonizing. > > I've narrowed it down to just the setting of the SIGCLD signal. […] > Thank you, this *really* helps narrow down the problem. I don't know > if I'll simply be removing the handling as you suggest, but it > certainly makes the range of solutions much clearer. I'm also glad to see a test case that causes exactly the same error with or without the presence of a ‘daemon.DaemonContext’. Further research shows that handling of ‘SIGCLD’ (or ‘SIGCLD’) is fairly OS-specific, with “ignore it” or “handle it specifically” being correct on different systems. I think Python's default handling of this signal is already good (modulo bug #1731717 to be addressed in ‘subprocess’). So I will apply a change similar to Joel Martin's suggestion, to default to avoid touching the ‘SIGCLD’ signal at all, and with extra notes in the documentation that anyone using child processes needs to be wary of signal handling. This causes the above test case to succeed; the output file contains:: ===== Child process via os.system. Child process via 'subprocess.Popen'. Parent daemon process. Parent daemon process done. ===== -- \ “Reality must take precedence over public relations, for nature | `\ cannot be fooled.” —Richard P. Feynman | _o__) | Ben Finney -- http://mail.python.org/mailman/listinfo/python-list