Supervisor 报错 unix:///tmp/supervisor.sock no such file 的终极解决

2026-05-10 12点热度 0人点赞 0条评论

1. 现象描述

在 Linux 服务器上使用 Supervisor 管理进程时,很多同学会遇到这样一个诡异的问题: 程序运行初期一切正常,但运行一段时间(几天或几周)后,或者在一次系统维护后,执行 supervisorctl 命令时突然报错:

http://localhost:9001 refused connectionerror: <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 目录可能会有写入权限限制。此时建议在配置文件中使用专用目录:

  1. 修改路径为 /var/run/supervisor/supervisor.sock

  2. 预先创建该目录并赋权:

    Bash

    sudo mkdir -p /var/run/supervisor
    sudo chmod 777 /var/run/supervisor
    

5. 总结

不要信任 /tmp 目录! 在配置任何需要长期运行的服务(如 Supervisor、Gunicorn、Nginx FastCGI)时,如果涉及到 .sock.pid 文件,请务必将其放置在 /var/run/run 目录下。这一个小小的习惯,能为你省下大量的深夜排错时间。

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论