Skip to content

Commit

Permalink
copied the contents of daemon.py into watcher.py so that only watcher…
Browse files Browse the repository at this point in the history
….py is required to start the daemon
  • Loading branch information
gregghz committed Oct 5, 2010
1 parent fabc371 commit e0ec2f4
Show file tree
Hide file tree
Showing 5 changed files with 135 additions and 19 deletions.
7 changes: 7 additions & 0 deletions README
@@ -1,5 +1,12 @@
See jobs.yml for proper configuration syntax

Dependencies: python, python-pyinotify

In Ubuntu (and Debian):

sudo apt-get install python python-pyinotify


make sure watcher.py is marked as executable

chmod +x watcher.py
Expand Down
Binary file removed daemon.pyc
Binary file not shown.
4 changes: 0 additions & 4 deletions nbproject/project.properties

This file was deleted.

13 changes: 0 additions & 13 deletions nbproject/project.xml

This file was deleted.

130 changes: 128 additions & 2 deletions watcher.py
Expand Up @@ -19,8 +19,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

import sys, os, time, atexit
from signal import SIGTERM
import pyinotify
import daemon
import sys, os
import datetime
import subprocess
Expand All @@ -32,6 +33,131 @@
from yaml import CDumper as Dumper
except ImportError:
from yaml import Loader, Dumper

class Daemon:
"""
A generic daemon class
Usage: subclass the Daemon class and override the run method
"""
def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
self.stdin = stdin
self.stdout = stdout
self.stderr = stderr
self.pidfile = pidfile

def daemonize(self):
"""
do the UNIX double-fork magic, see Stevens' "Advanced Programming in the
UNIX Environment" for details (ISBN 0201563177)
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
"""
try:
pid = os.fork()
if pid > 0:
#exit first parent
sys.exit(0)
except OSError, e:
sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)

# decouple from parent environment
os.chdir("/")
os.setsid()
os.umask(0)

# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent
sys.exit(0)
except OSError, e:
sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)

#redirect standard file descriptors
sys.stdout.flush()
sys.stderr.flush()
si = file(self.stdin, 'r')
so = file(self.stdout, 'a+')
se = file(self.stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())

#write pid file
atexit.register(self.delpid)
pid = str(os.getpid())
file(self.pidfile, 'w+').write("%s\n" % pid)

def delpid(self):
os.remove(self.pidfile)

def start(self):
"""
Start the daemon
"""
# Check for a pidfile to see if the daemon already runs
try:
pf = file(self.pidfile, 'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None

if pid:
message = "pidfile %s already exists. Daemon already running?\n"
sys.stderr.write(message % self.pidfile)
sys.exit(1)

# Start the Daemon
self.daemonize()
self.run()

def stop(self):
"""
Stop the daemon
"""
# get the pid from the pidfile
try:
pf = file(self.pidfile, 'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None

if not pid:
message = "pidfile %s does not exist. Daemon not running?\n"
sys.stderr.write(message % self.pidfile)
return # not an error in a restart

# Try killing the daemon process
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):
"""
Restart the daemon
"""
self.stop()
self.start()

def run(self):
"""
You should override this method when you subclass Daemon. It will be called after the process has been
daemonized by start() or restart().
"""

class EventHandler(pyinotify.ProcessEvent):
def __init__(self, command):
Expand Down Expand Up @@ -210,4 +336,4 @@ def _addMask(self, new_option, current_options):
except Exception, e:
print e
os.remove(log)
raise
raise

0 comments on commit e0ec2f4

Please sign in to comment.