I'm new to daemons so apologies if this is a newbie question.
In several other answers (for example, this question) people suggested the python-daemon package was the way to go because it fully implements the PEP 3143 standard.
Unfortunately, python-daemon is a bit light on documentation (or more likely I am a bit light on knowledge / experience... ;) ), and I think I am probably missing something really basic. Here's what I'm doing:
I have the following:
import daemon
logfile = open('daemon.log', 'w')
context = daemon.DaemonContext(stdout = logfile, stderr = logfile)
context.open()
with context:
do_something_1()
do_something_2()
Question: How do I set up a daemon with python-daemon, how can I start it and stop it?
Side notes:
I'm basically taking a wild guess about how / whether the .open()
method should be used here -- docs were not real clear on this point. Same thing seems to happen whether I include it or not.
So, now what do I do? When I try running this file, eg:
python startConsumerDaemons.py
it appears to run do_something_1()
, but not the second. And, it appears to leave the program attached to the terminal window. IE, stdout isn't redirected, and when I close the terminal window the process is killed. So, I'm pretty sure I'm doing something wrong here... what should I be doing differently?
And, lastly, once I get the daemon running, how do I stop / restart it (for example if I make changes to the underlying code)?
As you can see in the 'with' statement documentation, it statement does perform some 'magic', which is related to our purpose. Specifically:
What does this mean? If you look closely to the PEP in question, which serves as python-daemon documentation as well (and which indeed could be much improved), you'll see that it implements
__enter__()
and__exit__()
:In other words, open() is not needed, the example given in the PEP (though not explained correctly) works as is. While the with statement does mean something, it does not keep any loop, once the end of its scope is reached, it calls exit(), which in python-daemon means close(). Therefore, you need to put there a while True or which ever infinite loop you consider.
On behave of your second script not working, I can't really tell you, I'm surprised the first already works. If your daemon is stopping, there is a problem with your scripts for sure, you can check your consumerDaemonLogFile. (as a side note, you have a typo 'sderr' --> 'stderr')
Also, you can see in the PEP that if not specified, the working directory property defaults to '/'. this might be the source of your problem if you are using relative paths in your scripts.
Finally, about the last question, you can easily kill you're daemon finding its PID:
and sending it a SIGTERM:
The answer provided by gromain does provide a more handy way to start and stop it, with 'daemon.runner()', but it's far more complicated to setup.