diff --git a/src/util.py b/src/util.py --- a/src/util.py +++ b/src/util.py @@ -1,3 +1,38 @@ +import os +import sys + + +def spawnDaemon(fun): + # do the UNIX double-fork magic, see Stevens' "Advanced + # Programming in the UNIX Environment" for details (ISBN 0201563177) + try: + pid = os.fork() + if pid > 0: + # parent process, return and keep running + return + except OSError as e: + print("fork #1 failed: {0} ({1})".format(e.errno,e.strerror),file=sys.stderr) + sys.exit(1) + + os.setsid() + + # do second fork + try: + pid = os.fork() + if pid > 0: + # exit from second parent + print("[{0}] server running".format(pid)) + sys.exit(0) + except OSError as e: + print("fork #2 failed: {0} ({1})".format(e.errno,e.strerror),file=sys.stderr) + sys.exit(1) + + fun() + + # all done + os._exit(os.EX_OK) + + class Progress: def __init__(self,n,i0=0): self._n=n