|  | @@ -314,24 +314,104 @@ Available options
 | 
	
		
			
				|  |  |      Always create logfile directory.  By default only enable when no custom
 | 
	
		
			
				|  |  |      logfile location set.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +.. _generic-initd-troubleshooting:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Troubleshooting
 | 
	
		
			
				|  |  | +----------------------------------------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If you can't get the init-scripts to work, you should try running
 | 
	
		
			
				|  |  | +them in *verbose mode*:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: console
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # sh -x /etc/init.d/celeryd start
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This can reveal hints as to why the service won't start.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If the worker starts with *"OK"* but exits almost immediately afterwards
 | 
	
		
			
				|  |  | +and there is nothing in the log file, then there is probably an error
 | 
	
		
			
				|  |  | +but as the daemons standard outputs are already closed you'll
 | 
	
		
			
				|  |  | +not be able to see them anywhere.  For this situation you can use
 | 
	
		
			
				|  |  | +the :envvar:`C_FAKEFORK` environment variable to skip the
 | 
	
		
			
				|  |  | +daemonization step:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: console
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # C_FAKEFORK=1 sh -x /etc/init.d/celeryd start
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +and now you should be able to see the errors.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Commonly such errors are caused by insufficient permissions
 | 
	
		
			
				|  |  | +to read from, or write to a file, and also by syntax errors
 | 
	
		
			
				|  |  | +in configuration modules, user modules, third-party libraries,
 | 
	
		
			
				|  |  | +or even from Celery itself (if you've found a bug, in which case
 | 
	
		
			
				|  |  | +you should :ref:`report it <reporting-bugs>`).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  .. _daemon-systemd-generic:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Usage ``systemd``
 | 
	
		
			
				|  |  |  ======================================================================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +* `extra/systemd/`_
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. _`extra/systemd/`:
 | 
	
		
			
				|  |  | +    https://github.com/celery/celery/tree/3.1/extra/systemd/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  .. _generic-systemd-celery:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +:Usage: `systemctl {start|stop|restart|status} celery.service`
 | 
	
		
			
				|  |  | +:Configuration file: /etc/conf.d/celery
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Service file: celery.service
 | 
	
		
			
				|  |  |  ----------------------------------------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -:Usage: `systemctl {start|stop|restart|status} celery.service`
 | 
	
		
			
				|  |  | -:Configuration file: /etc/conf.d/celery
 | 
	
		
			
				|  |  | +This is an example systemd file:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +:file:`/etc/systemd/system/celery.service`:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: bash
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  [Unit]
 | 
	
		
			
				|  |  | +  Description=Celery Service
 | 
	
		
			
				|  |  | +  After=network.target
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  [Service]
 | 
	
		
			
				|  |  | +  Type=forking
 | 
	
		
			
				|  |  | +  User=celery
 | 
	
		
			
				|  |  | +  Group=celery
 | 
	
		
			
				|  |  | +  EnvironmentFile=-/etc/conf.d/celery
 | 
	
		
			
				|  |  | +  WorkingDirectory=/opt/celery
 | 
	
		
			
				|  |  | +  ExecStart=/bin/sh '${CELERY_BIN} multi start $CELERYD_NODES \
 | 
	
		
			
				|  |  | +  	-A $CELERY_APP --logfile=${CELERYD_LOG_FILE} \
 | 
	
		
			
				|  |  | +  	--pidfile=${CELERYD_PID_FILE} $CELERYD_OPTS'
 | 
	
		
			
				|  |  | +  ExecStop=/bin/sh '${CELERY_BIN} multi stopwait $CELERYD_NODES \
 | 
	
		
			
				|  |  | +  	--pidfile=${CELERYD_PID_FILE}'
 | 
	
		
			
				|  |  | +  ExecReload=/bin/sh '${CELERY_BIN} multi restart $CELERYD_NODES \
 | 
	
		
			
				|  |  | +  	-A $CELERY_APP --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
 | 
	
		
			
				|  |  | +  	--loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  [Install]
 | 
	
		
			
				|  |  | +  WantedBy=multi-user.target
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Once you've put that file in :file:`/etc/systemd/system`, you should run
 | 
	
		
			
				|  |  | +:command:`systemctl daemon-reload` in order that Systemd acknowledges that file.
 | 
	
		
			
				|  |  | +You should also run that command each time you modify it.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +To configure user, group, :command:`chdir` change settings: 
 | 
	
		
			
				|  |  | +``User``, ``Group``, and ``WorkingDirectory`` defined in 
 | 
	
		
			
				|  |  | +:file:`/etc/systemd/system/celery.service`.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +You can also use systemd-tmpfiles in order to create working directories (for logs and pid).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +:file: `/etc/tmpfiles.d/celery.conf`
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: bash
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  d /var/run/celery 0755 celery celery -
 | 
	
		
			
				|  |  | +  d /var/log/celery 0755 celery celery -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -To create a temporary folders for the log and pid files change user and group in
 | 
	
		
			
				|  |  | -:file:`/usr/lib/tmpfiles.d/celery.conf`.
 | 
	
		
			
				|  |  | -To configure user, group, :command:`chdir` change settings:
 | 
	
		
			
				|  |  | -``User``, ``Group``, and ``WorkingDirectory`` defines in
 | 
	
		
			
				|  |  | -:file:`/usr/lib/systemd/system/celery.service`.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .. _generic-systemd-celery-example:
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -398,40 +478,6 @@ This is an example configuration for those using :pypi:`django-celery`:
 | 
	
		
			
				|  |  |  To add an environment variable such as :envvar:`DJANGO_SETTINGS_MODULE`
 | 
	
		
			
				|  |  |  use the Environment in :file:`celery.service`.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -.. _generic-initd-troubleshooting:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Troubleshooting
 | 
	
		
			
				|  |  | -----------------------------------------------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -If you can't get the init-scripts to work, you should try running
 | 
	
		
			
				|  |  | -them in *verbose mode*:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: console
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # sh -x /etc/init.d/celeryd start
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -This can reveal hints as to why the service won't start.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -If the worker starts with *"OK"* but exits almost immediately afterwards
 | 
	
		
			
				|  |  | -and there is nothing in the log file, then there is probably an error
 | 
	
		
			
				|  |  | -but as the daemons standard outputs are already closed you'll
 | 
	
		
			
				|  |  | -not be able to see them anywhere.  For this situation you can use
 | 
	
		
			
				|  |  | -the :envvar:`C_FAKEFORK` environment variable to skip the
 | 
	
		
			
				|  |  | -daemonization step:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: console
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    # C_FAKEFORK=1 sh -x /etc/init.d/celeryd start
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -and now you should be able to see the errors.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Commonly such errors are caused by insufficient permissions
 | 
	
		
			
				|  |  | -to read from, or write to a file, and also by syntax errors
 | 
	
		
			
				|  |  | -in configuration modules, user modules, third-party libraries,
 | 
	
		
			
				|  |  | -or even from Celery itself (if you've found a bug, in which case
 | 
	
		
			
				|  |  | -you should :ref:`report it <reporting-bugs>`).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  .. _daemon-supervisord:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  :pypi:`supervisor`
 |