错误的用户用于supervisor的celeryd

7 投票
1 回答
4120 浏览
提问于 2025-04-17 11:13

我有一些定期要执行的任务,是用celery来处理的(通过supervisord来管理)。但是,当我尝试在我为supervisor设置的用户的主目录下创建一个文件夹时,出现了“权限被拒绝”的错误。查看正在运行的celery任务中的os.environ字典时,我发现USER这个变量被设置为'root',而不是我在supervisord配置中为celery设置的用户。

这是我的/usr/local/etc/supervisord.conf文件的内容:

[unix_http_server]
file=/tmp/supervisor.sock
chmod=0777

[supervisord]
logfile=/var/log/supervisord.log
pidfile=/var/run/supervisord.pid

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock

[program:celery]
command=/home/<USER>/.virtualenvs/sync/bin/celeryd --beat --loglevel=INFO
environment=PYTHONPATH=/home/<USER>/apps/sync
directory=/home/<USER>/apps/sync
user=<USER>
numprocs=1
stdout_logfile=/var/log/celeryd.log
stderr_logfile=/var/log/celeryd.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 30

这可能是什么原因造成的呢?任何帮助都非常感谢!

1 个回答

9

我觉得这个问题是因为你没有设置HOME和USER这两个环境变量。使用“user=”选项时,如果你的子进程依赖这些变量,就必须设置它们。

根据supervisord的文档,关于子进程环境的说明:

当supervisord运行一个子进程时,并不会执行任何shell,所以像USER、PATH、HOME、SHELL、LOGNAME等环境变量不会被改变,仍然保持默认值或其他分配的值。

所以你可以试试:

environment=USER=<USER>,HOME=/home/<USER>,PYTHONPATH=/home/<USER>/apps/sync

撰写回答