• 【supervisor】 问题处理 unix:///var/run/supervisor/supervisor.sock no such file


    问题描述

    最近笔者在配置 supervisor,希望用 supervisor 进行进程服务管理的时候遇到了一些问题,具体是:

    1. 运行 supervisorctl status 的时候遇到了 unix:///var/run/supervisor/supervisor.sock no such file 的问题。
    2. 在运行 sudo service supervisor status 的时候遇到了下面的报错
    sudo service supervisor status
    ● supervisor.service - Supervisor process control system for UNIX
         Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor >
         Active: activating (auto-restart) (Result: exit-code) since Thu 2023-10->
           Docs: http://supervisord.org
        Process: 190236 ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supe>
       Main PID: 190236 (code=exited, status=2)
            CPU: 249ms
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    总的来说就是 supervisor 有问题。

    重现过程和解决方案

    查询 supervisor status 的时候发生以下报错:

    sudo service supervisor status
    ● supervisor.service - Supervisor process control system for UNIX
         Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor >
         Active: activating (auto-restart) (Result: exit-code) since Thu 2023-10->
           Docs: http://supervisord.org
        Process: 190236 ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supe>
       Main PID: 190236 (code=exited, status=2)
            CPU: 249ms
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    根据 status 显示的信息,Supervisor 服务当前处于激活状态,并设置为自动重启。主要的 PID(进程ID)显示为 190236,表明该服务以退出代码2的状态退出。

    退出代码2通常表示出现错误。为了确定具体的问题,需要检查 Supervisor 服务的日志。日志可能会提供关于为何服务无法启动的更详细信息。

    可以通过运行以下命令查看 Supervisor 服务的日志:

    sudo journalctl -u supervisor.service
    
    • 1

    该命令将显示与 Supervisor 服务相关的日志。查找任何错误消息或线索,以帮助确定问题所在。

    日志输出如下所示:

    9月 28 02:35:20 zeeland-virtual-machine systemd[1]: Started Supervisor proces>
    9月 28 02:35:21 zeeland-virtual-machine supervisord[36451]: 2023-09-28 02:35:>
    9月 28 02:35:21 zeeland-virtual-machine supervisord[36451]: 2023-09-28 02:35:>
    9月 28 02:35:21 zeeland-virtual-machine supervisord[36451]: 2023-09-28 02:35:>
    9月 28 02:35:21 zeeland-virtual-machine supervisord[36451]: 2023-09-28 02:35:>
    9月 28 02:35:21 zeeland-virtual-machine supervisord[36451]: 2023-09-28 02:35:>
    9月 28 03:09:14 zeeland-virtual-machine systemd[1]: Stopping Supervisor proce>
    9月 28 03:09:15 zeeland-virtual-machine supervisorctl[38468]: Shut down
    9月 28 03:09:15 zeeland-virtual-machine systemd[1]: supervisor.service: Deact>
    9月 28 03:09:15 zeeland-virtual-machine systemd[1]: Stopped Supervisor proces>
    -- Boot 4f9509fffa594d7b8b1d628356c22065 --
    9月 28 03:09:36 zeeland-virtual-machine systemd[1]: Started Supervisor proces>
    9月 28 03:09:37 zeeland-virtual-machine supervisord[895]: 2023-09-28 03:09:37>
    9月 28 03:09:37 zeeland-virtual-machine supervisord[895]: 2023-09-28 03:09:37>
    9月 28 03:09:37 zeeland-virtual-machine supervisord[895]: 2023-09-28 03:09:37>
    9月 28 03:09:37 zeeland-virtual-machine supervisord[895]: 2023-09-28 03:09:37>
    9月 28 03:09:37 zeeland-virtual-machine supervisord[895]: 2023-09-28 03:09:37>
    9月 28 05:21:44 zeeland-virtual-machine systemd[1]: Stopping Supervisor proce>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    日志中可以看到 supervisor 什么时候启动,什么时候停止,但是无法查看具体的报错信息。接下来我直接使用 supervisorctl status 查看其服务是否正常启动,运行结果如下:

    unix:///var/run/supervisor/supervisor.sock no such file
    
    • 1

    可以看到,这里产生了新的错误,supervisorctl 没启动,肯定连 supervisord 都没启动起来,于是我跑到官网看文档

    Image

    官网的教程说使用 $BINDIR/supervisord 启动 supervisord,这里应该将 $BINDIR 替换为包含 supervisorod 可执行文件的目录的实际路径。例如,如果 supervisorord 可执行文件位于 /usr/local/bin 目录中,则命令将为 /usr/local/bin/supervisord。

    输入 ls /usr/bin | grep supervisor 确认一下文件是否存在。

    echo_supervisord_conf
    supervisorctl
    supervisord
    zeeland@zeeland-virtual-machine:/etc/supervisor$ 
    
    • 1
    • 2
    • 3
    • 4

    于是我们直接运行 /usr/bin/supervisord,这个时候我发生了如下报错:

    zeeland@zeeland-virtual-machine:/var/run/supervisor$ /usr/bin/supervisord
    Error: Format string 'kubectl --context %(ENV_KUBECTL_CONTEXT)s port-forward -n babel-system services/babel-controller 8080:80' for 'program:port-forward-ctrl.command' contains names ('ENV_KUBECTL_CONTEXT') which cannot be expanded. Available names: ENV_AMENT_PREFIX_PATH, ENV_COLORTERM, ENV_DBUS_SESSION_BUS_ADDRESS, ENV_DESKTOP_SESSION, ENV_DISPLAY, ENV_GDMSESSION, ENV_GIO_LAUNCHED_DESKTOP_FILE, ENV_GIO_LAUNCHED_DESKTOP_FILE_PID, ENV_GJS_DEBUG_OUTPUT, ENV_GJS_DEBUG_TOPICS, ENV_GNOME_DESKTOP_SESSION_ID, ENV_GNOME_SETUP_DISPLAY, ENV_GNOME_SHELL_SESSION_MODE, ENV_GTK_MODULES, ENV_HOME, ENV_IBUS_DISABLE_SNOOPER, ENV_IM_CONFIG_PHASE, ENV_INVOCATION_ID, ENV_JOURNAL_STREAM, ENV_LANG, ENV_LANGUAGE, ENV_LC_ADDRESS, ENV_LC_IDENTIFICATION, ENV_LC_MEASUREMENT, ENV_LC_MONETARY, ENV_LC_NAME, ENV_LC_NUMERIC, ENV_LC_PAPER, ENV_LC_TELEPHONE, ENV_LC_TIME, ENV_LD_LIBRARY_PATH, ENV_LESSCLOSE, ENV_LESSOPEN, ENV_LOGNAME, ENV_LS_COLORS, ENV_MANAGERPID, ENV_OLDPWD, ENV_PATH, ENV_PWD, ENV_PYTHONPATH, ENV_QT_ACCESSIBILITY, ENV_QT_IM_MODULE, ENV_ROS_DISTRO, ENV_ROS_LOCALHOST_ONLY, ENV_ROS_PYTHON_VERSION, ENV_ROS_VERSION, ENV_SESSION_MANAGER, ENV_SHELL, ENV_SHLVL, ENV_SSH_AGENT_LAUNCHER, ENV_SSH_AUTH_SOCK, ENV_SYSTEMD_EXEC_PID, ENV_TERM, ENV_TERMINATOR_DBUS_NAME, ENV_TERMINATOR_DBUS_PATH, ENV_TERMINATOR_UUID, ENV_USER, ENV_USERNAME, ENV_VTE_VERSION, ENV_WAYLAND_DISPLAY, ENV_XAUTHORITY, ENV_XDG_CONFIG_DIRS, ENV_XDG_CURRENT_DESKTOP, ENV_XDG_DATA_DIRS, ENV_XDG_MENU_PREFIX, ENV_XDG_RUNTIME_DIR, ENV_XDG_SESSION_CLASS, ENV_XDG_SESSION_DESKTOP, ENV_XDG_SESSION_TYPE, ENV_XMODIFIERS, ENV__, group_name, here, host_node_name, numprocs, process_num, program_name in section 'program:port-forward-ctrl' (file: '/etc/supervisor/conf.d/babel.conf')
    For help, use /usr/bin/supervisord -h
    
    • 1
    • 2
    • 3

    这是我需要配置的端口映射,我存在了 /etc/supervisor/conf.d/babel.conf 下面,conf 里面使用了 %(ENV_KUBECTL_CONTEXT)s 作为变量。
    既然没有识别到这个变量,那就把它改成一个实际的值就好了。

    supervisor conf 这里是可以这样子配置变量的,但是笔者现在暂时也没有找到 %(ENV_KUBECTL_CONTEXT)s 这个变量,之前笔者到底在哪里声明的,以后有精力再找吧。

    kubectl --context %(ENV_KUBECTL_CONTEXT)s port-forward -n babel-system services/babel-controller 8080:80
    
    • 1

    因此我把 conf 里面的变量删除掉之后,在运行 /usr/bin/supervisord 就可以正常启动了。

    输入 sudo service supervisor status 也可以正常启动了。

    zeeland@zeeland-virtual-machine:/etc/supervisor$ sudo service supervisor status
    ● supervisor.service - Supervisor process control system for UNIX
         Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor >
         Active: active (running) since Thu 2023-10-19 19:15:57 CST; 1min 26s ago
           Docs: http://supervisord.org
       Main PID: 255641 (supervisord)
          Tasks: 238 (limit: 28698)
         Memory: 327.6M
            CPU: 43.548s
         CGroup: /system.slice/supervisor.service
                 ├─255641 /usr/bin/python3 /usr/bin/supervisord -n -c /etc/superv>
                 ├─255708 kubectl --context kind-babelcloud port-forward -n babel>
                 ├─255709 kubectl --context kind-babelcloud port-forward -n babel>
                 ├─255715 kubectl --context kind-babelcloud port-forward -n babel>
                 ├─255716 kubectl --context kind-babelcloud port-forward -n babel>
                 ├─255723 kubectl --context kind-babelcloud port-forward -n babel>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    但事实上,如果你想使用 service 进行管理,这样子是有问题的。

    优化措施

    /usr/bin/supervisord 是直接运行 /usr/bin/supervisord 可执行文件的方式,这将启动 supervisord 进程,并使用默认的配置文件(通常是 /etc/supervisor/supervisord.conf)来管理进程。这种方式适用于手动启动 supervisord,并且可以根据需要指定其他选项和配置文件。

    实际开发中,我们一般使用 systemd 或者 service 对服务进行管理,因此下面我们使用 systemctl 对 supervisor 进行控制,

    创建一个新的 Supervisor 服务文件,可以使用以下命令:

    sudo nano /etc/systemd/system/supervisor.service
    
    • 1

    在文件中添加以下内容:

    [Unit]
    Description=Supervisor process control system
    Documentation=http://supervisord.org
    
    [Service]
    ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
    ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
    ExecReload=/usr/bin/supervisorctl $OPTIONS reload
    KillMode=process
    Restart=on-failure
    RestartSec=50s
    
    [Install]
    WantedBy=multi-user.target
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    保存并关闭文件。

    启动 Supervisor 服务:

    运行以下命令启动 Supervisor 服务:

    sudo service supervisor start
    
    • 1

    如果您希望 Supervisor 在系统启动时自动启动,可以运行以下命令:

    sudo service supervisor enable
    
    • 1

    现在,您已经安装了 Supervisor 并使用 service 进行启动管理。您可以通过修改 Supervisor 配置文件来管理更多的应用程序,并使用相应的命令启动、停止和重启它们。

  • 相关阅读:
    面试题:Rabbitmq怎么保证消息的可靠性?
    数据治理之主数据管理MDM
    JS 防抖封装方法
    【前端设计模式】之原型模式
    银行人总结5个影响系统性能的因素,怕是很多人都会忽略
    分布式事务
    Java多态之动态绑定机制
    淘宝/天猫获取卖出的商品订单列表 API
    如此理解sed会简单
    GSCoolink GSV2201S DisplayPort 1.4转HDMI 2.0
  • 原文地址:https://blog.csdn.net/linZinan_/article/details/133950072