Created
January 14, 2015 17:24
-
-
Save wess/bbed59defedc3aba0e17 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import os | |
import time | |
import atexit | |
from signal import SIGTERM | |
class Daemon: | |
def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): | |
self.pidfile = pidfile | |
self.stdin = stdin | |
self.stdout = stdout | |
self.stderr = stderr | |
def background(self): | |
try: | |
pid = os.fork() | |
if pid > 0: | |
sys.exit(0) | |
except OSError, e: | |
sys.stderr.write("Fork #1 failed: %d (%s)" % (e.errno, e.strerror)) | |
os.chdir('/') | |
os.setsid() | |
os.umask(0) | |
try: | |
pid = os.fork() | |
if pid > 0: | |
sys.exit(0) | |
except OSError, e: | |
sys.stderr.write("Fork #2 failed: %d (%s)" % (e.errno, e.strerror)) | |
sys.exit(1) | |
sys.stdout.flush() | |
sys.stderr.flush() | |
input = file(self.stdin, 'r') | |
output = file(self.stdout, 'a+') | |
error = file(self.stderr, 'a+', 0) | |
os.dup2(input.fileno(), sys.stdin.fileno()) | |
os.dup2(output.fileno(), sys.stdout.fileno()) | |
os.dup2(error.fileno(), sys.stderr.fileno()) | |
atexit.register(self.delete_pid) | |
pid = str(os.getpid()) | |
file(self.pidfile, 'w+').write('%s\n' % pid) | |
def delete_pid(self): | |
os.remove(self.pidfile) | |
def start(self): | |
try: | |
pid_file = file(self.pidfile, 'r') | |
pid = int(pid_file.read().strip()) | |
pid_file.close() | |
sys.stderr.write("Pid file %s already exist. Already running?\n" % self.pidfile) | |
sys.exit(1) | |
return | |
except IOError: | |
pid = None | |
self.background() | |
self.run() | |
def stop(self): | |
try: | |
pid_file = file(self.pidfile, 'r') | |
pid = int(pid_file.read().strip()) | |
pid_file.close() | |
except IOError: | |
pid = None | |
sys.stderr.write("Pidfile %s does not exist. Not running?" % self.pidfile) | |
return | |
try: | |
while 1: os.kill(pid, SIGTERM) | |
time.sleep(0.1) | |
except OSError, err: | |
err = str(err) | |
if err.find('No such process') > 0: | |
if os.path.exists(self.pidfile): | |
os.remove(self.pidfile) | |
else: | |
print str(err) | |
sys.exit(1) | |
def restart(self): | |
self.stop() | |
self.start() | |
def run(self): | |
""" Override in subclass """ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment