Context manager for a pid (process id) file used to tell whether a daemon process is still running.
On entry, it writes the pid of the current process to the path. On exit, it removes the file.
Designed to work with python-daemon.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | # Dual licensed under the MIT and GPL licenses.
import fcntl
import os
class PidFile(object):
"""Context manager that locks a pid file. Implemented as class
not generator because daemon.py is calling .__exit__() with no parameters
instead of the None, None, None specified by PEP-343."""
# pylint: disable=R0903
def __init__(self, path):
self.path = path
self.pidfile = None
def __enter__(self):
self.pidfile = open(self.path, "a+")
try:
fcntl.flock(self.pidfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
raise SystemExit("Already running according to " + self.path)
self.pidfile.seek(0)
self.pidfile.truncate()
self.pidfile.write(str(os.getpid()))
self.pidfile.flush()
self.pidfile.seek(0)
return self.pidfile
def __exit__(self, exc_type=None, exc_value=None, exc_tb=None):
try:
self.pidfile.close()
except IOError as err:
# ok if file was just closed elsewhere
if err.errno != 9:
raise
os.remove(self.path)
# example usage
import daemon
context = daemon.DaemonContext()
context.pidfile = PidFile("/var/run/mydaemon")
|
You would use this because the pid file tools that come with python-daemon are not correctly implemented as a context manager.
Hi, I was wondering if you could dual license this (add the GPL) as I want to use it in an existing GPL projects (pywws).
Thanks.
Hi Daniel, the MIT license is GPL-compatible, meaning you can include it in GPL projects, without affecting the license of the rest of the code. All you gain from dual-licensing is not having to include the license text (http://opensource.org/licenses/MIT) in the file defining the class. But sure, no harm, I'll edit the snippet.
OK, thanks very much!