| Index: tools/testrunner/server/daemon.py
|
| diff --git a/tools/testrunner/server/daemon.py b/tools/testrunner/server/daemon.py
|
| deleted file mode 100644
|
| index baa66fbea91be0af914934e5aed56686938078fd..0000000000000000000000000000000000000000
|
| --- a/tools/testrunner/server/daemon.py
|
| +++ /dev/null
|
| @@ -1,147 +0,0 @@
|
| -#!/usr/bin/env python
|
| -
|
| -# This code has been written by Sander Marechal and published at:
|
| -# http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
|
| -# where the author has placed it in the public domain (see comment #6 at
|
| -# http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/#c6
|
| -# ).
|
| -# Some minor modifications have been made by the V8 authors. The work remains
|
| -# in the public domain.
|
| -
|
| -import atexit
|
| -import os
|
| -from signal import SIGTERM
|
| -from signal import SIGINT
|
| -import sys
|
| -import time
|
| -
|
| -
|
| -class Daemon(object):
|
| - """
|
| - 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)
|
| - # TODO: (debug) re-enable this!
|
| - #os.dup2(si.fileno(), sys.stdin.fileno())
|
| - #os.dup2(so.fileno(), sys.stdout.fileno())
|
| - #os.dup2(se.fileno(), sys.stderr.fileno())
|
| -
|
| - # write pidfile
|
| - 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 exist. 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:
|
| - # Give the process a one-second chance to exit gracefully.
|
| - os.kill(pid, SIGINT)
|
| - time.sleep(1)
|
| - 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().
|
| - """
|
|
|