How do you create a daemon in Python?

后端 未结 16 1697
轻奢々
轻奢々 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:28

    since python-daemon has not yet supported python 3.x, and from what can be read on the mailing list, it may never will, i have written a new implementation of PEP 3143: pep3143daemon

    pep3143daemon should support at least python 2.6, 2.7 and 3.x

    It also contains a PidFile class.

    The library only depends on the standard library and on the six module.

    It can be used as a drop in replacement for python-daemon.

    Here is the documentation.

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

    One more to thing to think about when daemonizing in python:

    If your are using python logging and you want to continue using it after daemonizing, make sure to call close() on the handlers (particularly the file handlers).

    If you don't do this the handler can still think it has files open, and your messages will simply disappear - in other words make sure the logger knows its files are closed!

    This assumes when you daemonise you are closing ALL the open file descriptors indiscriminatingly - instead you could try closing all but the log files (but it's usually simpler to close all then reopen the ones you want).

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

    The easiest way to create daemon with Python is to use the Twisted event-driven framework. It handles all of the stuff necessary for daemonization for you. It uses the Reactor Pattern to handle concurrent requests.

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

    There are many fiddly things to take care of when becoming a well-behaved daemon process:

    • prevent core dumps (many daemons run as root, and core dumps can contain sensitive information)

    • behave correctly inside a chroot gaol

    • set UID, GID, working directory, umask, and other process parameters appropriately for the use case

    • relinquish elevated suid, sgid privileges

    • close all open file descriptors, with exclusions depending on the use case

    • behave correctly if started inside an already-detached context, such as init, inetd, etc.

    • set up signal handlers for sensible daemon behaviour, but also with specific handlers determined by the use case

    • redirect the standard streams stdin, stdout, stderr since a daemon process no longer has a controlling terminal

    • handle a PID file as a cooperative advisory lock, which is a whole can of worms in itself with many contradictory but valid ways to behave

    • allow proper cleanup when the process is terminated

    • actually become a daemon process without leading to zombies

    Some of these are standard, as described in canonical Unix literature (Advanced Programming in the UNIX Environment, by the late W. Richard Stevens, Addison-Wesley, 1992). Others, such as stream redirection and PID file handling, are conventional behaviour most daemon users would expect but that are less standardised.

    All of these are covered by the PEP 3143 “Standard daemon process library” specification. The python-daemon reference implementation works on Python 2.7 or later, and Python 3.2 or later.

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

    After a few years and many attempts (I tried all the answers given here, but all of them had minor drawbacks at the end), now I realize that there is a better way than wanting to start, stop, restart a daemon directly from Python: use the OS tools instead.

    For example, for Linux, instead of doing python myapp start and python myapp stop, I do this to start the app:

    screen -S myapp python myapp.py    
    CTRL+A, D to detach
    

    or screen -dmS myapp python myapp.py to start and detach it in one command.

    Then:

    screen -r myapp
    

    to attach to this terminal again. Once in the terminal, it's possible to use CTRL+C to stop it.

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

    80% of the time, when folks say "daemon", they only want a server. Since the question is perfectly unclear on this point, it's hard to say what the possible domain of answers could be. Since a server is adequate, start there. If an actual "daemon" is actually needed (this is rare), read up on nohup as a way to daemonize a server.

    Until such time as an actual daemon is actually required, just write a simple server.

    Also look at the WSGI reference implementation.

    Also look at the Simple HTTP Server.

    "Are there any additional things that need to be considered? " Yes. About a million things. What protocol? How many requests? How long to service each request? How frequently will they arrive? Will you use a dedicated process? Threads? Subprocesses? Writing a daemon is a big job.

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