本地Docker环境下,如何用Supervisord自动重启Symfony Messenger Workers?
解决Symfony Messenger Workers代码更新后自动重启的方案
针对本地开发环境中代码更新后需要手动停止Messenger Workers的问题,这里提供几个实用的实现思路:
思路1:利用Supervisord事件监听器监听文件变化
Supervisord支持自定义事件监听器,可通过脚本监控项目核心代码目录的文件变更,触发自动停止Worker的操作:
- 编写文件监控脚本(比如
watch_code_changes.sh):
#!/bin/bash # 监控src、config等核心代码目录的变更 inotifywait -m -r -e modify,create,delete /var/www/html/src /var/www/html/config | while read path action file; do # 触发Worker停止命令 php /var/www/html/bin/console messenger:stop-workers done
给脚本添加执行权限:chmod +x watch_code_changes.sh
- 在Supervisord配置中添加事件监听器:
[eventlistener:code-change-watcher] command=/var/www/html/watch_code_changes.sh user=root autostart=true autorestart=true stdout_logfile=/var/log/supervisor/code-watcher.log stderr_logfile=/var/log/supervisor/code-watcher.err.log
此后只要代码目录有文件增删改,脚本就会自动执行停止命令,Supervisord的autorestart=true配置会自动重启新的Worker进程。
思路2:修改Worker启动命令,让进程自动检测代码变化后退出
无需额外监听器,直接修改Supervisord的Worker配置,让Worker进程在代码变化时自行终止,依赖Supervisord的自动重启特性:
修改原Worker配置的command字段,结合inotifywait实现:
[program:messenger-consume-sandbox] process_name=%(program_name)s_%(process_num)02d command=bash -c "inotifywait -q -r -e modify,create,delete /var/www/html/src /var/www/html/config & PID=$!; php bin/console messenger:consume sandbox -vv --time-limit=7200; kill $PID" user=root numprocs=2 startsecs=0 autostart=true autorestart=true startretries=10
该命令逻辑:后台启动inotifywait监控代码变化,同时启动Worker;当检测到文件变更时inotifywait退出,或Worker达到时间限制退出,最终杀掉监控进程。只要代码变化,整个命令就会结束,Supervisord会自动重启新的Worker。
思路3:本地脚本配合容器命令触发操作
如果本地代码通过挂载/同步工具映射到容器,可在本地写脚本监控代码变化,通过docker exec进入容器执行停止命令:
本地监控脚本示例(local_watch.sh):
#!/bin/bash inotifywait -m -r -e modify,create,delete ./src ./config | while read path action file; do docker exec <你的容器名称> php bin/console messenger:stop-workers done
启动脚本后,本地代码变更时会自动触发容器内的Worker停止命令。
内容的提问来源于stack exchange,提问作者BENCHAABANE Fahim
相关产品推荐
相关产品推荐

