如何使用systemd在Ubuntu 16.04上运行celery守护程序?

我正在使用Ubuntu 16.04和systemd来运行celery作为守护进程。 我也创建了单元文件,但我无法将芹菜作为服务运行。 为什么会发生这种错误?

以下是/etc/systemd/system/celery.service的内容:

 [Unit] Description=Celery Service After=network.target [Service] Type=forking User=celery Group=celery EnvironmentFile=-/etc/default/celery WorkingDirectory=/srv/weaver/src ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \ -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \ --pidfile=${CELERYD_PID_FILE}' ExecReload=/bin/sh -c '${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 

这是/etc/default/celery文件:

 ENABLED="true" CELERYD_NODES="worker1" #CELERYD_NODES="worker1 worker2 worker3" CELERY_BIN="/usr/local/bin/celery" CELERY_APP="main:celery_app" CELERYD_CHDIR="/srv/weaver/src" CELERYD_OPTS=" --queue=weaver --time-limit=100000 --concurrency=2" CELERYD_LOG_FILE="/var/log/celery/%N.log" CELERY_D_LOG_LEVEL="DEBUG" CELERYD_PID_FILE="/var/run/celery2/%N.pid" CELERYD_USER="celery" CELERYD_GROUP="celery" CELERY_CREATE_DIRS=1 # Change Celery Beat CELERYBEAT_CHDIR="/srv/weaver/src" # Log files CELERYBEAT_LOG_FILE="/var/log/celery/celerybeat.log" # Celery Beat Log files CELERYBEAT_PID_FILE="/var/run/celery/celerybeat.pid" # Scheduler for celery CELERYBEAT_OPTS=" --pidfile=/var/run/celery/celerybeat.pid --schedule=/var/run/celery/celerybeat-schedule" 

这是正在运行的服务的输出:

 ● celery.service - Celery Service Loaded: loaded (/etc/systemd/system/celery.service; disabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2017-01-12 17:12:32 IST; 2min 17s ago Process: 18561 ExecStop=/bin/sh -c ${CELERY_BIN} multi stopwait ${CELERYD_NODES} --pidfile=${CELERYD_PID_FILE} (code=exited, status=0/SUCCESS) Process: 18540 ExecStart=/bin/sh -c ${CELERY_BIN} multi start ${CELERYD_NODES} -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FIL Main PID: 18555 (code=exited, status=1/FAILURE) Jan 12 17:12:30 fb01 systemd[1]: Starting Celery Service... Jan 12 17:12:31 fb01 sh[18540]: celery multi v3.1.23 (Cipater) Jan 12 17:12:31 fb01 sh[18540]: > Starting nodes... Jan 12 17:12:31 fb01 sh[18540]: > worker1@fb01: OK Jan 12 17:12:31 fb01 systemd[1]: Started Celery Service. Jan 12 17:12:32 fb01 systemd[1]: celery.service: Main process exited, code=exited, status=1/FAILURE Jan 12 17:12:32 fb01 sh[18561]: celery multi v3.1.23 (Cipater) Jan 12 17:12:32 fb01 sh[18561]: > worker1@fb01: DOWN Jan 12 17:12:32 fb01 systemd[1]: celery.service: Unit entered failed state. Jan 12 17:12:32 fb01 systemd[1]: celery.service: Failed with result 'exit-code'. 

我不久前遇到了同样的问题。

  • /etc/default/celery文件中使用CELERY_CONFIG_MODULE对我很有帮助。
  • 还要检查是否有名为celery的用户。 你可以在另一个没有特权的用户下运行芹菜。 我在自己的用户下推出芹菜。

下面是我的文件/etc/default/celery

 ENABLED="true" CELERYD_NODES="celery_worker" # Where to chdir at start. CELERYD_CHDIR="/path/to/my/project" CELERYD_OPTS="--time-limit=300 --concurrency=8" CELERY_CONFIG_MODULE="celeryd" CELERY_APP="celeryd:celery" # %n will be replaced with the nodename. CELERYD_LOG_FILE="/var/log/celery/%n.log" CELERYD_PID_FILE="/var/run/celery/%N.pid" # Workers should run as an unprivileged user. CELERYD_USER="my_user_name" CELERYD_GROUP="my_user_name" CELERY_CREATE_DIRS=1 CELERY_BIN="/usr/local/bin/celery" 

这是我的/etc/systemd/system/celery.service文件一个字一个字:

 [Unit] Description=Celery Service After=network.target [Service] Type=forking User=user Group=group EnvironmentFile=-/etc/default/celeryd WorkingDirectory=/opt/celery ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \ -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \ --pidfile=${CELERYD_PID_FILE}' ExecReload=/bin/sh -c '${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 

我有同样的症状,结果是权限。

在我的情况下,像:

 chmod o+x /srv/weaver/src 

排序了。

注意:这不是启用所需权限的最佳方式,但与此答案无关。