Mercurial > repos > melissacline > ucsc_xena_platform
comparison python-daemon-2.0.5/doc/FAQ @ 33:7ceb967147c3
start xena with no gui
add library files
| author | jingchunzhu <jingchunzhu@gmail.com> |
|---|---|
| date | Wed, 22 Jul 2015 13:24:44 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 32:63b1ba1e3424 | 33:7ceb967147c3 |
|---|---|
| 1 ‘python-daemon’ Frequently Asked Questions | |
| 2 ########################################## | |
| 3 | |
| 4 :Author: Ben Finney <ben+python@benfinney.id.au> | |
| 5 :Updated: 2015-01-10 | |
| 6 | |
| 7 .. contents:: | |
| 8 .. | |
| 9 1 General | |
| 10 1.1 What is the purpose of the ‘python-daemon’ library? | |
| 11 1.2 How can I run a service communicating with a separate daemon process? | |
| 12 2 Security | |
| 13 2.1 Why is the umask set to 0 by default? | |
| 14 3 File descriptors | |
| 15 3.1 Why does the output stop after opening the daemon context? | |
| 16 3.2 How can I preserve a ‘logging’ handler's file descriptor? | |
| 17 | |
| 18 General | |
| 19 ======= | |
| 20 | |
| 21 What is the purpose of the ‘python-daemon’ library? | |
| 22 --------------------------------------------------- | |
| 23 | |
| 24 The ‘python-daemon’ library has a deliberately narrow focus: that of | |
| 25 being a reference implementation for `PEP 3143`_, “Standard daemon | |
| 26 process library”. | |
| 27 | |
| 28 .. _`PEP 3143`: http://www.python.org/dev/peps/pep-3143 | |
| 29 | |
| 30 How can I run a service communicating with a separate daemon process? | |
| 31 --------------------------------------------------------------------- | |
| 32 | |
| 33 As specified in `PEP 3143`_, the ‘python-daemon’ library is | |
| 34 specifically focussed on the goal of having the *current running | |
| 35 program* become a well-behaved Unix daemon process. This leaves open | |
| 36 the question of how this program is started, or about multiple | |
| 37 programs interacting. As detailed in PEP 3143: | |
| 38 | |
| 39 A daemon is not a service | |
| 40 | |
| 41 There is a related concept in many systems, called a “service”. A | |
| 42 service differs from the model in this PEP, in that rather than | |
| 43 having the *current* program continue to run as a daemon process, | |
| 44 a service starts an *additional* process to run in the background, | |
| 45 and the current process communicates with that additional process | |
| 46 via some defined channels. | |
| 47 | |
| 48 The Unix-style daemon model in this PEP can be used, among other | |
| 49 things, to implement the background-process part of a service; but | |
| 50 this PEP does not address the other aspects of setting up and | |
| 51 managing a service. | |
| 52 | |
| 53 A possible starting point for such a “service” model of execution is | |
| 54 in a `message from 2009-01-30`_ to the ``python-ideas`` forum. | |
| 55 | |
| 56 .. _`message from 2009-01-30`: http://mail.python.org/pipermail/python-ideas/2009-January/002606.html | |
| 57 | |
| 58 | |
| 59 Security | |
| 60 ======== | |
| 61 | |
| 62 Why is the umask set to 0 by default? | |
| 63 ------------------------------------- | |
| 64 | |
| 65 A daemon should not rely on the parent process's umask value, which is | |
| 66 beyond its control and may prevent creating a file with the required | |
| 67 access mode. So when the daemon context opens, the umask is set to an | |
| 68 explicit known value. | |
| 69 | |
| 70 If the conventional value of 0 is too open, consider setting a value | |
| 71 such as 0o022, 0o027, 0o077, or another specific value. Otherwise, | |
| 72 ensure the daemon creates every file with an explicit access mode for | |
| 73 the purpose. | |
| 74 | |
| 75 | |
| 76 File descriptors | |
| 77 ================ | |
| 78 | |
| 79 Why does the output stop after opening the daemon context? | |
| 80 ---------------------------------------------------------- | |
| 81 | |
| 82 The specified behaviour in `PEP 3143`_ includes the requirement to | |
| 83 detach the process from the controlling terminal (to allow the process | |
| 84 to continue to run as a daemon), and to close all file descriptors not | |
| 85 known to be safe once detached (to ensure any files that continue to | |
| 86 be used are under the control of the daemon process). | |
| 87 | |
| 88 If you want the process to generate output via the system streams | |
| 89 ‘sys.stdout’ and ‘sys.stderr’, set the ‘DaemonContext’'s ‘stdout’ | |
| 90 and/or ‘stderr’ options to a file-like object (e.g. the ‘stream’ | |
| 91 attribute of a ‘logging.Handler’ instance). If these objects have file | |
| 92 descriptors, they will be preserved when the daemon context opens. | |
| 93 | |
| 94 How can I preserve a ‘logging’ handler's file descriptor? | |
| 95 --------------------------------------------------------- | |
| 96 | |
| 97 The ‘DaemonContext.open’ method conforms to `PEP 3143`_ by closing all | |
| 98 open file descriptors, but excluding those files specified in the | |
| 99 ‘files_preserve’ option. This option is a list of files or file | |
| 100 descriptors. | |
| 101 | |
| 102 The Python standard library ‘logging’ module provides log handlers | |
| 103 that write to streams, including to files via the ‘StreamHandler’ | |
| 104 class and its sub-classes. The documentation (both the online `logging | |
| 105 module documentation`_ and the docstrings for the code) makes no | |
| 106 mention of a way to get at the stream associated with a handler | |
| 107 object. | |
| 108 | |
| 109 However, looking at the source code for ‘StreamHandler’, in Python 2.5 | |
| 110 as ``/usr/lib/python2.5/logging/__init__.py``, shows a ‘stream’ | |
| 111 attribute that is bound to the stream object. The attribute is not | |
| 112 marked private (i.e. it is not named with a leading underscore), so we | |
| 113 can presume it is part of the public API. | |
| 114 | |
| 115 That attribute can then be used to specify that a logging handler's | |
| 116 file descriptor should, when the ‘DaemonContext’ opens, be excluded | |
| 117 from closure:: | |
| 118 | |
| 119 import logging | |
| 120 import daemon | |
| 121 | |
| 122 # any subclass of StreamHandler should provide the ‘stream’ attribute. | |
| 123 lh = logging.handlers.TimedRotatingFileHandler( | |
| 124 "/var/log/foo.log", | |
| 125 # … | |
| 126 ) | |
| 127 | |
| 128 # … do some logging and other activity … | |
| 129 | |
| 130 daemon_context = daemon.DaemonContext() | |
| 131 daemon_context.files_preserve = [lh.stream] | |
| 132 | |
| 133 daemon_context.open() | |
| 134 | |
| 135 # … continue as a daemon process … | |
| 136 | |
| 137 .. _`logging module documentation`: http://docs.python.org/library/logging | |
| 138 | |
| 139 | |
| 140 .. | |
| 141 This is free software: you may copy, modify, and/or distribute this work | |
| 142 under the terms of the Apache License version 2.0 as published by the | |
| 143 Apache Software Foundation. | |
| 144 No warranty expressed or implied. See the file ‘LICENSE.ASF-2’ for details. | |
| 145 | |
| 146 .. | |
| 147 Local variables: | |
| 148 coding: utf-8 | |
| 149 mode: text | |
| 150 mode: rst | |
| 151 time-stamp-format: "%:y-%02m-%02d" | |
| 152 time-stamp-start: "^:Updated:[ ]+" | |
| 153 time-stamp-end: "$" | |
| 154 time-stamp-line-limit: 20 | |
| 155 End: | |
| 156 vim: fileencoding=utf-8 filetype=rst : |
