1. 现象描述
在 Linux 服务器上使用 Supervisor 管理进程时,很多同学会遇到这样一个诡异的问题: 程序运行初期一切正常,但运行一段时间(几天或几周)后,或者在一次系统维护后,执行 supervisorctl 命令时突然报错:
http://localhost:9001 refused connection 或 error: <class 'FileNotFoundError'>, [Errno 2] No such file or directory: file: /usr/lib/python3/dist-packages/supervisor/xmlrpc.py line 560
最直接的报错提示通常是:
unix:///tmp/supervisor.sock no such file
2. 深度复盘:为什么文件会“消失”?
在 Supervisor 的默认配置中,用于进程间通信的 supervisor.sock 文件被放置在 /tmp 目录下。这就是问题的根源:
-
系统清理机制: 绝大多数 Linux 发行版(如 Ubuntu、CentOS)都有一套定期清理
/tmp目录的任务。如果该 socket 文件在一段时间内没有被频繁“触碰”,系统会认为它是过期临时文件并将其删除。 -
服务重启失效:
/tmp往往挂载在内存中(tmpfs),系统重启后内容会全部丢失。 -
权限变化: 某些系统安全策略会限制在
/tmp下创建长效的 socket 连接。
3. 解决方案:给 Socket 搬个“家”
要彻底解决这个问题,我们需要将 socket 文件从“临时宿舍” /tmp 搬迁到“永久住房” /var/run。
第一步:一键修改配置文件
我们使用 sed 命令直接修改 /etc/supervisord.conf,将所有 /tmp/supervisor.sock 替换为 /var/run/supervisor.sock。
Bash
sudo sed -i 's/\/tmp\/supervisor.sock/\/var\/run\/supervisor.sock/g' /etc/supervisord.conf
如果配置文件在:/etc/supervisor/supervisord.conf 则调整对应的路径
第二步:验证修改是否成功
执行以下命令确认配置文件中的 [unix_http_server] 和 [supervisorctl] 两部分已经更新:
Bash
grep "supervisor.sock" /etc/supervisord.conf
第三步:重启服务应用更改
修改完配置后,必须通过 systemctl 重启服务来重新生成 socket 文件:
Bash
# 重新加载系统服务配置
sudo systemctl daemon-reload
# 重启 supervisor
sudo systemctl restart supervisor 看下是否存在: ls /var/run/ | grep .sock
4. 进阶 Tip:权限防坑
如果你的 Supervisor 不是以 root 用户运行的,/var/run 目录可能会有写入权限限制。此时建议在配置文件中使用专用目录:
-
修改路径为
/var/run/supervisor/supervisor.sock。 -
预先创建该目录并赋权:
Bash
sudo mkdir -p /var/run/supervisor sudo chmod 777 /var/run/supervisor
5. 总结
不要信任 /tmp 目录! 在配置任何需要长期运行的服务(如 Supervisor、Gunicorn、Nginx FastCGI)时,如果涉及到 .sock 或 .pid 文件,请务必将其放置在 /var/run 或 /run 目录下。这一个小小的习惯,能为你省下大量的深夜排错时间。
文章评论