celery守护进程 - 日志文件权限被拒绝

6 投票
3 回答
7559 浏览
提问于 2025-04-18 00:29

我一直在努力把我的celery任务设置成一个守护进程,这样就可以按计划处理数据。

我在按照官方文档来设置我的守护进程,但遇到了一个日志文件权限错误,让我很困惑。

下面是我在Digital Ocean的Ubuntu服务器上设置的配置:

/etc/default/celeryd

# here we have a single node
CELERYD_NODES="w1"

CELERY_BIN = "/mix_daemon/venv/bin/celery"
CELERYD_CHDIR="/mix_daemon/"

CELERYD_OPTS="-A tasks worker --loglevel=info --beat"

# %n will be replaced with the nodename.
CELERYD_LOG_FILE="/var/log/celery/%n.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERY_CREATE_RUNDIR=0
CELERY_CREATE_LOGDIR=0

# Workers should run as an unprivileged user.
CELERYD_USER="celery"
CELERYD_GROUP="celery"

但是,当我运行

sh -x /etc/init.d/celeryd start

时,我收到了以下错误信息:

celery multi v3.1.7 (Cipater)
> Starting nodes...
> celery@mix: OK
Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/home/john/mix_daemon/venv/lib/python2.7/site-packages/celery/bin/celeryd_detach.py", line 168, in <module> main()
File "/home/john/mix_daemon/venv/lib/python2.7/site-packages/celery/bin/celeryd_detach.py", line 165, in main
detached_celeryd(app).execute_from_commandline()
File "/home/john/mix_daemon/venv/lib/python2.7/site-packages/celery/bin/celeryd_detach.py", line 160, in execute_from_commandline
**vars(options)
File "/home/john/mix_daemon/venv/lib/python2.7/site-packages/celery/bin/celeryd_detach.py", line 42, in detach
with detached(logfile, pidfile, uid, gid, umask, working_directory, fake):
File "/home/john/mix_daemon/venv/local/lib/python2.7/site-packages/celery/platforms.py", line 314, in open
self.after_chdir()
File "/home/john/mix_daemon/venv/local/lib/python2.7/site-packages/celery/platforms.py", line 384, in after_chdir_do
logfile and open(logfile, 'a').close()
IOError: [Errno 13] Permission denied: '/var/log/celery/celery.log'
+ sleep 5
+ exit 0

我查了一下这个错误信息,看到这个答案来自一个redmine项目。所以我尝试了以下方法,想让celery工作进程能够写入日志文件:

$ sudo mkdir -p -m 2755 /var/log/celery
$ sudo chown celery:celery /var/log/celery

但是当我尝试启动守护进程时,还是出现了同样的错误。

我对celery还很陌生,任何帮助都将不胜感激!

3 个回答

0

简而言之

如果你在使用 systemd 来管理后台服务,你的文件 /etc/tmpfiles.d/celery.conf 应该是这样的:

d /run/celery 0755 myuser myusergroup -
d /var/log/celery 0755 myuser myusergroup -

再多说一点

对于使用 systemd 的朋友,我发现我在为 celery 的日志创建工作目录时用了错误的用户。更新了 /etc/tmpfiles.d/celery.conf,把用户和用户组改成正确的后,我的问题就解决了。

文档中提到:

你也可以使用 systemd-tmpfiles 来创建工作目录(用于日志和进程ID)。

文件: /etc/tmpfiles.d/celery.conf

并给出了一个例子:

d /run/celery 0755 celery celery -
d /var/log/celery 0755 celery celery -

你的文件应该是这样的:

d /run/celery 0755 myuser myusergroup -
d /var/log/celery 0755 myuser myusergroup -
4

这对我有帮助:

sudo chown -R myuser:root /var/run/celery/
sudo chown -R myuser:root /var/log/celery/
3

根据文档的说明:

初始化脚本只能由超级用户(root)使用,而且这个 shell 配置文件也必须是超级用户拥有的。

所以,你需要运行:

sudo chown root:root /etc/default/celeryd

还有:

sudo /etc/init.d/celeryd start

顺便提一下,你的 celeryd 配置文件里有语法错误:

CELERY_BIN = "/mix_daemon/venv/bin/celery"

在 "=" 操作符旁边是不允许有空格的,正确的写法是:

CELERY_BIN="/mix_daemon/venv/bin/celery"

另外,检查一下你的 bin 文件夹是在 /mix_daemon 而不是 /home//mix_daemon。

撰写回答