Thread: pg_ctl start doesn't daemonize properly
I am having problems getting pg_ctl to detach from the controlling terminal so that it's a proper daemon. I am running
pg_ctl start -w -s -l $logfile within a script, which is invoked from an automated test framework written in python. If the python process is stopped by Ctrl-C, postgres dies. But the documentation for pg_ctl says "pg_ctl encapsulates tasks such as redirecting log output and properly detaching from the terminal and process group" and "if no log file is chosen, the standard output of pg_ctl should be redirected to a file or piped to another process such as a log rotating program like rotatelogs; otherwise postgres will write its output to the controlling terminal (from the background) and will not leave the shell's process group." I think I am doing what is necessary here -- you can see that I am specifying the logfile in the invocation. So why do all the postmaster processes die when I Ctrl-C the python process? Is there any way to get insight into what's happening here?
Allan
> I am having problems getting pg_ctl to detach from the controlling terminal > so that it's a proper daemon. I figured out the problem, and record it here in hopes that it will help others. The silent_mode setting was not on, so postmaster initialization was not calling setsid(), which is a necessary step to dissociate from the controlling terminal (and thereby gain immunity from Ctrl-C on parent processes). The logging setup I have (stdout logged to a specified logfile and stderr redirected) seems to still work, despite the warnings to the contrary in the config file template. I don't know why proper daemonization is linked to being in "silent_mode", but... there you go. Thanks for making the source code online, google-searchable, and cross-referenced by doxygen -- I would have been stuck much longer otherwise. Allan