daemonizing.rst 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. .. _daemonizing:
  2. ================================
  3. Running the worker as a daemon
  4. ================================
  5. Celery does not daemonize itself, please use one of the following
  6. daemonization tools.
  7. .. contents::
  8. :local:
  9. .. _daemon-generic:
  10. Generic init scripts
  11. ====================
  12. See the `extra/generic-init.d/`_ directory Celery distribution.
  13. This directory contains generic bash init scripts for the
  14. :program:`celery worker` program,
  15. these should run on Linux, FreeBSD, OpenBSD, and other Unix-like platforms.
  16. .. _`extra/generic-init.d/`:
  17. http://github.com/celery/celery/tree/3.1/extra/generic-init.d/
  18. .. _generic-initd-celeryd:
  19. Init script: celeryd
  20. --------------------
  21. :Usage: `/etc/init.d/celeryd {start|stop|restart|status}`
  22. :Configuration file: /etc/default/celeryd
  23. To configure this script to run the worker properly you probably need to at least
  24. tell it where to change
  25. directory to when it starts (to find the module containing your app, or your
  26. configuration module).
  27. The daemonization script is configured by the file ``/etc/default/celeryd``,
  28. which is a shell (sh) script. You can add environment variables and the
  29. configuration options below to this file. To add environment variables you
  30. must also export them (e.g. ``export DISPLAY=":0"``)
  31. .. Admonition:: Superuser privileges required
  32. The init scripts can only be used by root,
  33. and the shell configuration file must also be owned by root.
  34. Unprivileged users do not need to use the init script,
  35. instead they can use the :program:`celery multi` utility (or
  36. :program:`celery worker --detach`):
  37. .. code-block:: bash
  38. $ celery multi start worker1 \
  39. -A proj \
  40. --pidfile="$HOME/run/celery/%n.pid" \
  41. --logfile="$HOME/log/celery/%n.log"
  42. $ celery multi restart worker1 \
  43. -A proj \
  44. --logfile="$HOME/log/celery/%n%I.log" \
  45. --pidfile="$HOME/run/celery/%n.pid
  46. $ celery multi stopwait worker1 --pidfile="$HOME/run/celery/%n.pid"
  47. .. _generic-initd-celeryd-example:
  48. Example configuration
  49. ~~~~~~~~~~~~~~~~~~~~~
  50. This is an example configuration for a Python project.
  51. :file:`/etc/default/celeryd`:
  52. .. code-block:: bash
  53. # Names of nodes to start
  54. # most will only start one node:
  55. CELERYD_NODES="worker1"
  56. # but you can also start multiple and configure settings
  57. # for each in CELERYD_OPTS (see `celery multi --help` for examples).
  58. CELERYD_NODES="worker1 worker2 worker3"
  59. # Absolute or relative path to the 'celery' command:
  60. CELERY_BIN="/usr/local/bin/celery"
  61. #CELERY_BIN="/virtualenvs/def/bin/celery"
  62. # App instance to use
  63. # comment out this line if you don't use an app
  64. CELERY_APP="proj"
  65. # or fully qualified:
  66. #CELERY_APP="proj.tasks:app"
  67. # Where to chdir at start.
  68. CELERYD_CHDIR="/opt/Myproject/"
  69. # Extra command-line arguments to the worker
  70. CELERYD_OPTS="--time-limit=300 --concurrency=8"
  71. # %N will be replaced with the first part of the nodename.
  72. CELERYD_LOG_FILE="/var/log/celery/%N.log"
  73. CELERYD_PID_FILE="/var/run/celery/%N.pid"
  74. # Workers should run as an unprivileged user.
  75. # You need to create this user manually (or you can choose
  76. # a user/group combination that already exists, e.g. nobody).
  77. CELERYD_USER="celery"
  78. CELERYD_GROUP="celery"
  79. # If enabled pid and log directories will be created if missing,
  80. # and owned by the userid/group configured.
  81. CELERY_CREATE_DIRS=1
  82. .. _generic-initd-celeryd-django-example:
  83. Example Django configuration
  84. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  85. Django users now uses the exact same template as above,
  86. but make sure that the module that defines your Celery app instance
  87. also sets a default value for :envvar:`DJANGO_SETTINGS_MODULE`
  88. as shown in the example Django project in :ref:`django-first-steps`.
  89. .. _generic-initd-celeryd-options:
  90. Available options
  91. ~~~~~~~~~~~~~~~~~~
  92. * CELERY_APP
  93. App instance to use (value for ``--app`` argument).
  94. If you're still using the old API, or django-celery, then you
  95. can omit this setting.
  96. * CELERY_BIN
  97. Absolute or relative path to the :program:`celery` program.
  98. Examples:
  99. * :file:`celery`
  100. * :file:`/usr/local/bin/celery`
  101. * :file:`/virtualenvs/proj/bin/celery`
  102. * :file:`/virtualenvs/proj/bin/python -m celery`
  103. * CELERYD_NODES
  104. List of node names to start (separated by space).
  105. * CELERYD_OPTS
  106. Additional command-line arguments for the worker, see
  107. `celery worker --help` for a list. This also supports the extended
  108. syntax used by `multi` to configure settings for individual nodes.
  109. See `celery multi --help` for some multi-node configuration examples.
  110. * CELERYD_CHDIR
  111. Path to change directory to at start. Default is to stay in the current
  112. directory.
  113. * CELERYD_PID_FILE
  114. Full path to the PID file. Default is /var/run/celery/%N.pid
  115. * CELERYD_LOG_FILE
  116. Full path to the worker log file. Default is /var/log/celery/%N.log
  117. * CELERYD_LOG_LEVEL
  118. Worker log level. Default is INFO.
  119. * CELERYD_USER
  120. User to run the worker as. Default is current user.
  121. * CELERYD_GROUP
  122. Group to run worker as. Default is current user.
  123. * CELERY_CREATE_DIRS
  124. Always create directories (log directory and pid file directory).
  125. Default is to only create directories when no custom logfile/pidfile set.
  126. * CELERY_CREATE_RUNDIR
  127. Always create pidfile directory. By default only enabled when no custom
  128. pidfile location set.
  129. * CELERY_CREATE_LOGDIR
  130. Always create logfile directory. By default only enable when no custom
  131. logfile location set.
  132. .. _generic-initd-celerybeat:
  133. Init script: celerybeat
  134. -----------------------
  135. :Usage: `/etc/init.d/celerybeat {start|stop|restart}`
  136. :Configuration file: /etc/default/celerybeat or /etc/default/celeryd
  137. .. _generic-initd-celerybeat-example:
  138. Example configuration
  139. ~~~~~~~~~~~~~~~~~~~~~
  140. This is an example configuration for a Python project:
  141. `/etc/default/celerybeat`:
  142. .. code-block:: bash
  143. # Absolute or relative path to the 'celery' command:
  144. CELERY_BIN="/usr/local/bin/celery"
  145. #CELERY_BIN="/virtualenvs/def/bin/celery"
  146. # App instance to use
  147. # comment out this line if you don't use an app
  148. CELERY_APP="proj"
  149. # or fully qualified:
  150. #CELERY_APP="proj.tasks:app"
  151. # Where to chdir at start.
  152. CELERYBEAT_CHDIR="/opt/Myproject/"
  153. # Extra arguments to celerybeat
  154. CELERYBEAT_OPTS="--schedule=/var/run/celery/celerybeat-schedule"
  155. .. _generic-initd-celerybeat-django-example:
  156. Example Django configuration
  157. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  158. You should use the same template as above, but make sure the
  159. ``DJANGO_SETTINGS_MODULE`` variable is set (and exported), and that
  160. ``CELERYD_CHDIR`` is set to the projects directory:
  161. .. code-block:: bash
  162. export DJANGO_SETTINGS_MODULE="settings"
  163. CELERYD_CHDIR="/opt/MyProject"
  164. .. _generic-initd-celerybeat-options:
  165. Available options
  166. ~~~~~~~~~~~~~~~~~
  167. * CELERY_APP
  168. App instance to use (value for ``--app`` argument).
  169. * CELERYBEAT_OPTS
  170. Additional arguments to celerybeat, see `celerybeat --help` for a
  171. list.
  172. * CELERYBEAT_PID_FILE
  173. Full path to the PID file. Default is /var/run/celeryd.pid.
  174. * CELERYBEAT_LOG_FILE
  175. Full path to the celeryd log file. Default is /var/log/celeryd.log
  176. * CELERYBEAT_LOG_LEVEL
  177. Log level to use for celeryd. Default is INFO.
  178. * CELERYBEAT_USER
  179. User to run beat as. Default is current user.
  180. * CELERYBEAT_GROUP
  181. Group to run beat as. Default is current user.
  182. * CELERY_CREATE_DIRS
  183. Always create directories (log directory and pid file directory).
  184. Default is to only create directories when no custom logfile/pidfile set.
  185. * CELERY_CREATE_RUNDIR
  186. Always create pidfile directory. By default only enabled when no custom
  187. pidfile location set.
  188. * CELERY_CREATE_LOGDIR
  189. Always create logfile directory. By default only enable when no custom
  190. logfile location set.
  191. .. _daemon-systemd-generic:
  192. Usage systemd
  193. =============
  194. .. _generic-systemd-celery:
  195. Service file: celery.service
  196. ----------------------------
  197. :Usage: `systemctl {start|stop|restart|status} celery.service`
  198. :Configuration file: /etc/conf.d/celery
  199. To create a temporary folders for the log and pid files change user and group in
  200. /usr/lib/tmpfiles.d/celery.conf.
  201. To configure user, group, chdir change settings User, Group and WorkingDirectory defines
  202. in /usr/lib/systemd/system/celery.service.
  203. .. _generic-systemd-celery-example:
  204. Example configuration
  205. ~~~~~~~~~~~~~~~~~~~~~
  206. This is an example configuration for a Python project:
  207. :file:`/etc/conf.d/celery`:
  208. .. code-block:: bash
  209. # Name of nodes to start
  210. # here we have a single node
  211. CELERYD_NODES="w1"
  212. # or we could have three nodes:
  213. #CELERYD_NODES="w1 w2 w3"
  214. # Absolute or relative path to the 'celery' command:
  215. CELERY_BIN="/usr/local/bin/celery"
  216. #CELERY_BIN="/virtualenvs/def/bin/celery"
  217. # How to call manage.py
  218. CELERYD_MULTI="multi"
  219. # Extra command-line arguments to the worker
  220. CELERYD_OPTS="--time-limit=300 --concurrency=8"
  221. # %N will be replaced with the first part of the nodename.
  222. CELERYD_LOG_FILE="/var/log/celery/%N.log"
  223. CELERYD_PID_FILE="/var/run/celery/%N.pid"
  224. .. _generic-systemd-celeryd-django-example:
  225. Example Django configuration
  226. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  227. This is an example configuration for those using `django-celery`:
  228. .. code-block:: bash
  229. # Name of nodes to start
  230. # here we have a single node
  231. CELERYD_NODES="w1"
  232. # or we could have three nodes:
  233. #CELERYD_NODES="w1 w2 w3"
  234. # Absolute path to "manage.py"
  235. CELERY_BIN="/opt/Myproject/manage.py"
  236. # How to call manage.py
  237. CELERYD_MULTI="celery multi"
  238. # Extra command-line arguments to the worker
  239. CELERYD_OPTS="--time-limit=300 --concurrency=8"
  240. # %N will be replaced with the first part of the nodename.
  241. CELERYD_LOG_FILE="/var/log/celery/%N.log"
  242. CELERYD_PID_FILE="/var/run/celery/%N.pid"
  243. To add an environment variable such as DJANGO_SETTINGS_MODULE use the
  244. Environment in celery.service.
  245. .. _generic-initd-troubleshooting:
  246. Troubleshooting
  247. ---------------
  248. If you can't get the init scripts to work, you should try running
  249. them in *verbose mode*:
  250. .. code-block:: bash
  251. # sh -x /etc/init.d/celeryd start
  252. This can reveal hints as to why the service won't start.
  253. If the worker starts with "OK" but exits almost immediately afterwards
  254. and there is nothing in the log file, then there is probably an error
  255. but as the daemons standard outputs are already closed you'll
  256. not be able to see them anywhere. For this situation you can use
  257. the :envvar:`C_FAKEFORK` environment variable to skip the
  258. daemonization step:
  259. .. code-block:: bash
  260. C_FAKEFORK=1 sh -x /etc/init.d/celeryd start
  261. and now you should be able to see the errors.
  262. Commonly such errors are caused by insufficient permissions
  263. to read from, or write to a file, and also by syntax errors
  264. in configuration modules, user modules, 3rd party libraries,
  265. or even from Celery itself (if you've found a bug, in which case
  266. you should :ref:`report it <reporting-bugs>`).
  267. .. _daemon-supervisord:
  268. `supervisord`_
  269. ==============
  270. * `extra/supervisord/`_
  271. .. _`extra/supervisord/`:
  272. http://github.com/celery/celery/tree/3.1/extra/supervisord/
  273. .. _`supervisord`: http://supervisord.org/
  274. .. _daemon-launchd:
  275. launchd (OS X)
  276. ==============
  277. * `extra/osx`_
  278. .. _`extra/osx`:
  279. http://github.com/celery/celery/tree/3.1/extra/osx/
  280. .. _daemon-windows:
  281. Windows
  282. =======
  283. See this excellent external tutorial:
  284. http://www.calazan.com/windows-tip-run-applications-in-the-background-using-task-scheduler/
  285. CentOS
  286. ======
  287. In CentOS we can take advantage of built-in service helpers, such as the
  288. pid-based status checker function in ``/etc/init.d/functions``.
  289. See the sample script in http://github.com/celery/celery/tree/3.1/extra/centos/.