Docker容器中通过Supervisor启动rsyslog遇重启循环的问题排查
问题描述
在Docker容器中通过Supervisor启动rsyslog时出现重启循环失败,配置及现象如下:
Dockerfile
FROM debian:buster-slim RUN set -e \ && apt-get update \ && apt-get install --yes \ rsyslog \ supervisor COPY /services/rsyslog.conf /etc/rsyslog.d/console.conf CMD ["supervisord", "-c", "/etc/supervisor.conf"]
supervisor.conf
[supervisord] #start in foreground nodaemon=true [program:syslog] command=service rsyslog start #[programm:another] #command=...
执行结果
process | 2022-10-27 10:07:09,906 INFO Set uid to user 0 succeeded process | 2022-10-27 10:07:09,907 INFO supervisord started with pid 1 process | 2022-10-27 10:07:10,910 INFO spawned: 'syslog' with pid 9 process | 2022-10-27 10:07:10,987 INFO exited: syslog (exit status 0; not expected) process | 2022-10-27 10:07:11,990 INFO spawned: 'syslog' with pid 22 process | 2022-10-27 10:07:11,999 INFO exited: syslog (exit status 0; not expected) process | 2022-10-27 10:07:14,003 INFO spawned: 'syslog' with pid 28 process | 2022-10-27 10:07:14,014 INFO exited: syslog (exit status 0; not expected) process | 2022-10-27 10:07:17,020 INFO spawned: 'syslog' with pid 34 process | 2022-10-27 10:07:17,030 INFO exited: syslog (exit status 0; not expected) process | 2022-10-27 10:07:17,031 INFO gave up: syslog entered FATAL state, too many start retries too quickly
问题原因
service rsyslog start是后台启动命令,执行完成后会立即退出(返回状态码0),但Supervisor要求管理的进程必须是前台运行的长期进程。- Supervisor检测到进程退出后,会判定为意外终止,因此不断尝试重启,最终触发重试次数限制进入FATAL状态。
解决方法
修改supervisor.conf中syslog程序的command,让rsyslog以前台方式运行:
[supervisord] nodaemon=true [program:syslog] # 直接调用rsyslogd前台运行,-n参数表示不后台守护 command=rsyslogd -n # 可选:重定向日志到容器标准输出/错误,方便查看 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0
同时确保rsyslog的自定义配置文件(/etc/rsyslog.d/console.conf)没有设置后台运行的参数,保持默认逻辑即可。
内容的提问来源于stack exchange,提问作者membersound
相关产品推荐
相关产品推荐

