commit
a10cf3dad3
@ -0,0 +1,73 @@ |
|||||||
|
import os, sys, signal |
||||||
|
|
||||||
|
log_file = None |
||||||
|
log_path = None |
||||||
|
|
||||||
|
def demonize(pid_file, force=False, logfile=None): |
||||||
|
global log_file |
||||||
|
global log_path |
||||||
|
|
||||||
|
# check if pid file exists and return if not a forced start |
||||||
|
if os.path.exists(pid_file) and not force: |
||||||
|
return False |
||||||
|
|
||||||
|
## Demonize |
||||||
|
if os.fork(): |
||||||
|
exit(0) |
||||||
|
os.umask(0) |
||||||
|
os.setsid() |
||||||
|
if os.fork(): |
||||||
|
exit(0) |
||||||
|
|
||||||
|
pid = open(pid_file,'w') |
||||||
|
pid.write(str(os.getpid())) |
||||||
|
pid.close() |
||||||
|
|
||||||
|
|
||||||
|
# The fileno is accessable after the first write |
||||||
|
sys.stdout.write('\0') |
||||||
|
sys.stderr.write('\0') |
||||||
|
sys.stdout.flush() |
||||||
|
sys.stderr.flush() |
||||||
|
|
||||||
|
ignore = open('/dev/null', 'r+') |
||||||
|
os.dup2(ignore.fileno(), sys.stdin.fileno()) |
||||||
|
|
||||||
|
if type(logfile)==file: |
||||||
|
log_file = logfile |
||||||
|
elif logfile!=None: |
||||||
|
log_file = open(logfile,'w') |
||||||
|
log_path = logfile |
||||||
|
else: |
||||||
|
log_file = ignore |
||||||
|
os.dup2(log_file.fileno(), sys.stdout.fileno()) |
||||||
|
os.dup2(log_file.fileno(), sys.stderr.fileno()) |
||||||
|
|
||||||
|
signal.signal(signal.SIGHUP, __sys_call(__sighup_handler) ) |
||||||
|
return True |
||||||
|
|
||||||
|
# decorator to make system call methods safe from EINTR |
||||||
|
def __sys_call(func): |
||||||
|
def __func(*args, **kwargs): |
||||||
|
try: |
||||||
|
rv = func(*args, **kwargs) |
||||||
|
except exception as e: |
||||||
|
if e.args and e.args[0] == EINTR: |
||||||
|
pass |
||||||
|
return rv |
||||||
|
return __func |
||||||
|
|
||||||
|
def __sighup_handler(sig,dontcare): |
||||||
|
global log_path |
||||||
|
global log_file |
||||||
|
import traceback |
||||||
|
try: |
||||||
|
if log_path != None: |
||||||
|
log_file.seek(0) |
||||||
|
log_file.close() |
||||||
|
log_file = open(log_path,'w') |
||||||
|
os.dup2(log_file.fileno(), sys.stdout.fileno()) |
||||||
|
os.dup2(log_file.fileno(), sys.stderr.fileno()) |
||||||
|
except: |
||||||
|
traceback.print_exc(file=sys.stdout) |
||||||
|
sys.exit(1) |
||||||
Loading…
Reference in new issue