How do you create a daemon in Python?

后端 未结 16 1699
轻奢々
轻奢々 2020-11-22 01:55

Searching on Google reveals x2 code snippets. The first result is to this code recipe which has a lot of documentation and explanation, along with some useful discussion und

相关标签:
16条回答
  • 2020-11-22 02:37

    Current solution

    A reference implementation of PEP 3143 (Standard daemon process library) is now available as python-daemon.

    Historical answer

    Sander Marechal's code sample is superior to the original, which was originally posted in 2004. I once contributed a daemonizer for Pyro, but would probably use Sander's code if I had to do it over.

    0 讨论(0)
  • 2020-11-22 02:37

    Note the python-daemon package which solves a lot of problems behind daemons out of the box.

    Among other features it enables to (from Debian package description):

    • Detach the process into its own process group.
    • Set process environment appropriate for running inside a chroot.
    • Renounce suid and sgid privileges.
    • Close all open file descriptors.
    • Change the working directory, uid, gid, and umask.
    • Set appropriate signal handlers.
    • Open new file descriptors for stdin, stdout, and stderr.
    • Manage a specified PID lock file.
    • Register cleanup functions for at-exit processing.
    0 讨论(0)
  • 2020-11-22 02:41

    An alternative -- create a normal, non-daemonized Python program then externally daemonize it using supervisord. This can save a lot of headaches, and is *nix- and language-portable.

    0 讨论(0)
  • 2020-11-22 02:41

    I am afraid the daemon module mentioned by @Dustin didn't work for me. Instead I installed python-daemon and used the following code:

    # filename myDaemon.py
    import sys
    import daemon
    sys.path.append('/home/ubuntu/samplemodule') # till __init__.py
    from samplemodule import moduleclass 
    
    with daemon.DaemonContext():
        moduleclass.do_running() # I have do_running() function and whatever I was doing in __main__() in module.py I copied in it.
    

    Running is easy

    > python myDaemon.py
    

    just for completeness here is samplemodule directory content

    >ls samplemodule
    __init__.py __init__.pyc moduleclass.py
    

    The content of moduleclass.py can be

    class moduleclass():
        ...
    
    def do_running():
        m = moduleclass()
        # do whatever daemon is required to do.
    
    0 讨论(0)
  • 2020-11-22 02:45

    This function will transform an application to a daemon:

    import sys
    import os
    
    def daemonize():
        try:
            pid = os.fork()
            if pid > 0:
                # exit first parent
                sys.exit(0)
        except OSError as err:
            sys.stderr.write('_Fork #1 failed: {0}\n'.format(err))
            sys.exit(1)
        # decouple from parent environment
        os.chdir('/')
        os.setsid()
        os.umask(0)
        # do second fork
        try:
            pid = os.fork()
            if pid > 0:
                # exit from second parent
                sys.exit(0)
        except OSError as err:
            sys.stderr.write('_Fork #2 failed: {0}\n'.format(err))
            sys.exit(1)
        # redirect standard file descriptors
        sys.stdout.flush()
        sys.stderr.flush()
        si = open(os.devnull, 'r')
        so = open(os.devnull, 'w')
        se = open(os.devnull, 'w')
        os.dup2(si.fileno(), sys.stdin.fileno())
        os.dup2(so.fileno(), sys.stdout.fileno())
        os.dup2(se.fileno(), sys.stderr.fileno())
    
    0 讨论(0)
  • 2020-11-22 02:48

    Here's my basic 'Howdy World' Python daemon that I start with, when I'm developing a new daemon application.

    #!/usr/bin/python
    import time
    from daemon import runner
    
    class App():
        def __init__(self):
            self.stdin_path = '/dev/null'
            self.stdout_path = '/dev/tty'
            self.stderr_path = '/dev/tty'
            self.pidfile_path =  '/tmp/foo.pid'
            self.pidfile_timeout = 5
        def run(self):
            while True:
                print("Howdy!  Gig'em!  Whoop!")
                time.sleep(10)
    
    app = App()
    daemon_runner = runner.DaemonRunner(app)
    daemon_runner.do_action()
    

    Note that you'll need the python-daemon library. You can install it by:

    pip install python-daemon
    

    Then just start it with ./howdy.py start, and stop it with ./howdy.py stop.

    0 讨论(0)
提交回复
热议问题