指摘修正

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()