Python Daemon Packaging Best Practices

后端 未结 10 1442
没有蜡笔的小新
没有蜡笔的小新 2021-01-30 09:48

I have a tool which I have written in python and generally should be run as a daemon. What are the best practices for packaging this tool for distribution, particularly how sho

10条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-01-30 09:54

    I can't remember where I downloaded it... but this is the best daemonizing script that I've found. It works beautifully (on Mac and Linux.) (save it as daemonize.py)

    import sys, os
    def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
        # Perform first fork.
        try:
            pid = os.fork( )
            if pid > 0:
                sys.exit(0) # Exit first parent.
        except OSError, e:
            sys.stderr.write("fork #1 failed: (%d) %sn" % (e.errno, e.strerror))
            sys.exit(1)
        # Decouple from parent environment.
        os.chdir("/")
        os.umask(0)
        os.setsid( )
        # Perform second fork.
        try:
            pid = os.fork( )
            if pid > 0:
                sys.exit(0) # Exit second parent.
        except OSError, e:
            sys.stderr.write("fork #2 failed: (%d) %sn" % (e.errno, e.strerror))
            sys.exit(1)
        # The process is now daemonized, redirect standard file descriptors.
        for f in sys.stdout, sys.stderr: f.flush( )
        si = file(stdin, 'r')
        so = file(stdout, 'a+')
        se = file(stderr, 'a+', 0)
        os.dup2(si.fileno( ), sys.stdin.fileno( ))
        os.dup2(so.fileno( ), sys.stdout.fileno( ))
        os.dup2(se.fileno( ), sys.stderr.fileno( ))
    

    In your script, you would simply:

    from daemonize import daemonize
    daemonize()
    

    And you can also specify places to redirect the stdio, err, etc...

提交回复
热议问题