问题描述
最近笔者在配置 supervisor,希望用 supervisor 进行进程服务管理的时候遇到了一些问题,具体是:
- 运行
supervisorctl status
的时候遇到了unix:///var/run/supervisor/supervisor.sock no such file
的问题。 - 在运行
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
总的来说就是 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
根据 status 显示的信息,supervisor 服务当前处于激活状态,并设置为自动重启。主要的 pid(进程id)显示为 190236,表明该服务以退出代码2的状态退出。
退出代码2通常表示出现错误。为了确定具体的问题,需要检查 supervisor 服务的日志。日志可能会提供关于为何服务无法启动的更详细信息。
可以通过运行以下命令查看 supervisor 服务的日志:
sudo journalctl -u supervisor.service
该命令将显示与 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>
日志中可以看到 supervisor 什么时候启动,什么时候停止,但是无法查看具体的报错信息。接下来我直接使用 supervisorctl status 查看其服务是否正常启动,运行结果如下:
unix:///var/run/supervisor/supervisor.sock no such file
可以看到,这里产生了新的错误,supervisorctl 没启动,肯定连 supervisord 都没启动起来,于是我跑到官网看文档
官网的教程说使用 $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$
于是我们直接运行 /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
这是我需要配置的端口映射,我存在了 /etc/supervisor/conf.d/babel.conf
下面,conf 里面使用了 %(env_kubectl_context)s
作为变量。
既然没有识别到这个变量,那就把它改成一个实际的值就好了。
kubectl --context %(env_kubectl_context)s port-forward -n babel-system services/babel-controller 8080:80
因此我把 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>
但事实上,如果你想使用 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
在文件中添加以下内容:
[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
保存并关闭文件。
启动 supervisor 服务:
运行以下命令启动 supervisor 服务:
sudo service supervisor start
如果您希望 supervisor 在系统启动时自动启动,可以运行以下命令:
sudo service supervisor enable
现在,您已经安装了 supervisor 并使用 service 进行启动管理。您可以通过修改 supervisor 配置文件来管理更多的应用程序,并使用相应的命令启动、停止和重启它们。
发表评论