通过 Supervisord 实现守护进程启动和重启 Hyperf 3.0 项目
docker容器中 apk安装 Supervisor
相关文档: coder55.com/article/158…
在Docker容器中安装Supervisor,您可以按照以下步骤进行操作:
- 打开终端,并登录到您的Docker容器中。
- 运行以下命令来更新包列表和安装Supervisor:
apk update
apk add supervisor
- 安装完成后,您可以使用以下命令来检查Supervisor是否已成功安装:
supervisord --version
- 安装完以后会生成文件 /etc/supervisord.conf 默认配置文件。
- 根据
/etc/supervisord.conf中最后一行:files = /etc/supervisor.d/*.ini;
要配置Supervisor,需要在/etc/supervisor.d/中创建一个.ini后缀的配置文件,并在其中定义要管理的进程。以下是一个我写的配置文件:
# 新建一个应用并设置一个名称,这里设置为 hyperf
[program:hyperf]
# 设置命令在指定的目录内执行
directory=/hyperf-skeleton/lgb-hf-online
# 这里为您要管理的项目的启动命令
command=php bin/hyperf.php start
# 以哪个用户来运行该进程
user=root
# supervisor启动时自动启动该应用
autostart=true
# 进程退出后自动重启进程
autorestart=true
# 进程持续运行多久才认为是启动成功
startsecs=1
# 重试次数
startretries=3
# stderr 标准输出日志输出位置
stderr_logfile=/hyperf-skeleton/lgb-hf-online/runtime/stderr.log
# stdout 标准错误日志输出位置
stdout_logfile=/hyperf-skeleton/lgb-hf-online/runtime/stdout.log
其中,[program:hyperf]是进程的名称,command是要运行的命令,directory是命令所在的目录,autostart表示是否自动启动进程,autorestart表示进程是否在退出后自动重启,redirect_stderr表示是否将标准错误重定向到标准输出。
- 保存配置文件后,您可以使用以下命令启动Supervisor:
supervisord -c /etc/supervisord.conf
- 现在,Supervisor将会管理您在配置文件中定义的进程。您可以使用以下命令来管理这些进程:
supervisorctl status # 查看进程状态
supervisorctl start hyperf # 启动进程
supervisorctl stop hyperf # 停止进程
supervisorctl restart hyperf # 重启进程
supervisorctl update 重新加载配置文件
supervisorctl reload 重新启动所有程序
这样,就成功在Docker容器中安装了Supervisor,并配置了要管理的进程。
修改配置,重新启动
1.修改hyperf.ini
-
supervisorctl stop hyperf停止进程 -
supervisorctl update重新加载配置文件 -
supervisorctl reload重新启动所有程序
关闭 Supervisor
-
检查Supervisor进程的状态,可以运行以下命令:
supervisorctl status这将显示Supervisor管理的进程的状态。
-
停止所有Supervisor管理的进程,可以运行以下命令:
supervisorctl stop all这将停止所有由Supervisor管理的进程。
-
检查Supervisor进程的状态,确保所有进程都已停止:
supervisorctl status如果所有进程都显示为停止状态,说明Supervisor已成功关闭。
卸载 (docker apk 安装的 Supervisor,如何卸载)
sock位置:file=/run/supervisord.sock ; the path to the socket file
log位置:logfile=/var/log/supervisord.log ; main log file; default $CWD/supervisord.log
pid位置:supervisord.pid
-
首先,停止Supervisor服务:
supervisorctl stop all -
apk del supervisor卸载Supervisor -
删除Supervisor的配置文件和日志文件,
rm -rf /run/supervisord.sock rm -rf /var/log/supervisord.log rm -rf /etc/supervisord.pid
无限重启问题
当我使用以下命令:php bin/hyperf.php start > /dev/hyperferror.log 2>&1 & 就会陷入无限重启。
原因:Supervisor会监控该进程的状态,并在进程退出后尝试重新启动它。然而,由于您使用了&符号将进程置于后台运行,Supervisor无法检测到进程的退出状态,因此会不断尝试重新启动。
stdout_logfile和stderr_logfile分别指定了标准输出和标准错误的日志文件路径。所以不再需要 > /dev/hyperferror.log 2>&1 &
常见错误
1.Unlinking stale socket /run/supervisord.sock
当您看到Supervisor输出Unlinking stale socket /run/supervisord.sock时,它意味着Supervisor在启动时发现了一个陈旧(stale)的Unix套接字文件,并试图删除它。
该消息通常是由于之前的Supervisor进程异常终止,但Unix套接字文件未正确清理导致的。为了解决这个问题,您可以按照以下步骤进行操作:
- 确保没有其他Supervisor进程正在运行。您可以使用以下命令来检查正在运行的Supervisor进程:
ps -ef | grep supervisord
- 如果发现其他Supervisor进程正在运行,请停止它们。使用以下命令将其杀死(将
<pid>替换为实际的进程ID):
kill -9 <pid>
- 删除陈旧的Unix套接字文件。运行以下命令:
rm /run/supervisord.sock
- 重新启动Supervisor。运行以下命令:
supervisord -c /etc/supervisord.conf
在重新启动Supervisor时,它会创建一个新的Unix套接字文件。
这样,您应该能够解决Unlinking stale socket的问题并成功启动Supervisor。