指摘修正
yasusiiさめに突っ込まれたところは、こんなもんで。
# ps ax --forest 6201 ? Ss 0:01 \_ sshd: kinneko [priv] 6203 ? S 2:32 \_ sshd: kinneko@pts/2 6204 pts/2 Ss 0:04 \_ -bash 6825 pts/2 S 0:00 \_ su - 6826 pts/2 S+ 0:06 \_ -su 7168 ? S 0:00 /usr/bin/python ./daapd.py 7169 ? R 0:00 \_ /usr/bin/python ./daapd.py 7170 ? S 0:00 \_ /usr/bin/python ./daapd.py 7171 ? S 0:00 \_ /usr/bin/python ./daapd.py
ふぅ... まだ先は長い。
やっぱ、プログラマ向きじゃないのね...
#!/usr/bin/python #-*- coding: utf-8 -*- # Licsense: Python Software Foundation License Version 2 # http://wiki.python.org/moin/PythonSoftwareFoundationLicenseV2Easy # Copyright 2007 kinneko <kinneko@gmail.com> # daemonize code Copyright by: # Chris <cliechti(at)gmx(dot)net> http://homepage.hispeed.ch/py430/python/index.html # Jurgen Hermanns http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 EXECNAME = "daapd.py" VERSION = "a0.4" WORKDIR = "/home/kinneko/py-daapd/" LOGFILE = WORKDIR + 'daapd.log' PIDFILE = WORKDIR + 'daapd.pid' import Zeroconf import socket import BaseHTTPServer import DaapHTTPServer import signal, sys, os hostname = socket.gethostname() hostaddr = socket.gethostbyname(socket.gethostname()) daapZConfType = "_daap._tcp.local." daapZConfHost = hostname + "." + daapZConfType daapPort = 3689 class Log: """file like for writes with auto flush after each writex to ensure that everything is logged, even during anx unexpected exit.""" def __init__(self, f): self.f = f def write(self, s): self.f.write(s) self.f.flush() def daapServer(addr, HandlerClass = DaapHTTPServer.DaapHTTPRequestHandler, ServerClass = DaapHTTPServer.ThreadingDaapHTTPServer): HandlerClass.protocol_version = 'HTTP/1.0' httpd = ServerClass(addr, HandlerClass) sa = httpd.socket.getsockname() print "\nServing HTTP on %s:%d" % (sa[0], sa[1]) httpd.serve_forever() def main(): #change to data directory if needed os.chdir(WORKDIR) #redirect outputs to a logfile sys.stdout = sys.stderr = Log(open(LOGFILE, 'a+')) #ensure the that the daemon runs a normal user #os.setegid(103) #set group first "pydaemon" #os.seteuid(103) #set user "pydaemon" #start the user program here: def handler(signum, frame): print 'Signal handler called with signal', signum print " daapd.py: remove mDNS." r.unregisterService(info) r.close() sys.exit(signum) signal.signal(signal.SIGTERM, handler) r = Zeroconf.Zeroconf() info = Zeroconf.ServiceInfo( daapZConfType, daapZConfHost, socket.inet_aton(hostaddr), daapPort, 0, 0, '') r.registerService(info) print " daapd.py: regist mDNS." addr = (hostaddr, daapPort) try: print " daapd.py: Server daemonized." daapServer(addr) except: print " daapd.py: Server stopped." if __name__ == "__main__": # 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: # exit first parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # decouple from parent environment os.chdir("/") #don't prevent unmounting.... os.setsid() os.umask(022) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent, print eventual PID before #print "Daemon PID %d" % pid open(PIDFILE,'w').write("%d"%pid) sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # start the daemon main loop main()