RHEL8.7下systemd管理的Docker服务每10秒重启问题求助
问题描述
- 系统环境:Red Hat Enterprise Linux release 8.7 (Ootpa)
- 场景:创建systemd服务管理RTDE UR Plugin的Docker容器,执行
systemctl start rtdeplugin后服务每10秒自动重启,但直接在命令行运行相同docker命令时容器运行正常。
systemd服务配置
# systemd service definition file [Unit] Description=RTDE UR Plugin After=docker.service Requires=docker.service [Service] # "-" path prefix makes systemd record the exit code, # but the unit is not set to failed. Restart=always StartLimitInterval=100 StandardOutput=journal+console WorkingDirectory=/root ExecStart=/usr/bin/docker run --rm -dit -e ROBOT_IP="172.17.0.2" --name rtdeplugin rtdeplugin:latest ExecStop=/usr/bin/docker stop rtdeplugin Environment=CI=true # Output to syslog StandardOutput=syslog StandardError=syslog SyslogIdentifier=rtdeplugin User=root Group=docker [Install] WantedBy=multi-user.target
服务日志
Mar 07 11:39:19 uslllx0057 systemd[1]: Started RTDE UR Plugin. Mar 07 11:39:19 uslllx0057 rtdeplugin[1121463]: 060ede6757d3c53607080694ce52e5bbe79c596b4eb2c20f2a11fd333710c673 Mar 07 11:39:29 uslllx0057 rtdeplugin[1121563]: rtdeplugin Mar 07 11:39:29 uslllx0057 systemd[1]: rtdeplugin.service: Succeeded. Mar 07 11:39:29 uslllx0057 systemd[1]: rtdeplugin.service: Service RestartSec=100ms expired, scheduling restart. Mar 07 11:39:29 uslllx0057 systemd[1]: rtdeplugin.service: Scheduled restart job, restart counter is at 1. Mar 07 11:39:29 uslllx0057 systemd[1]: Stopped RTDE UR Plugin. Mar 07 11:39:29 uslllx0057 systemd[1]: Started RTDE UR Plugin. Mar 07 11:39:29 uslllx0057 rtdeplugin[1121762]: 7a0d7a9b0995a58ddbe32fe74e1a17e5a8a9824850ec32dbdd85ced2edaae000 Mar 07 11:39:40 uslllx0057 rtdeplugin[1121861]: rtdeplugin Mar 07 11:39:40 uslllx0057 systemd[1]: rtdeplugin.service: Succeeded. Mar 07 11:39:40 uslllx0057 systemd[1]: rtdeplugin.service: Service RestartSec=100ms expired, scheduling restart. Mar 07 11:39:40 uslllx0057 systemd[1]: rtdeplugin.service: Scheduled restart job, restart counter is at 2. Mar 07 11:39:40 uslllx0057 systemd[1]: Stopped RTDE UR Plugin.
问题原因
核心问题是systemd监控的是docker run命令本身的进程,而非Docker容器进程:
- 使用
docker run -dit时,docker命令启动容器后会立即后台运行并退出(返回码0,标记为执行成功); - 你的systemd配置中设置了
Restart=always,该参数会在服务进程无论以何种原因退出时(包括成功退出)触发重启; - 命令行执行时,你只关注容器运行状态,不会在意
docker run命令本身退出,因此看起来正常。
解决方法
方法1:让docker run以前台模式运行(推荐)
去掉docker run命令中的-d参数,让容器在前台运行,这样docker命令会一直保持运行状态,直到容器停止,systemd就能正确监控服务状态:
修改ExecStart行:
ExecStart=/usr/bin/docker run --rm -it -e ROBOT_IP="172.17.0.2" --name rtdeplugin rtdeplugin:latest
注意:如果容器启动脚本本身就是前台运行的,去掉-d即可;如果容器默认后台运行,需调整容器内的启动命令确保前台运行。
方法2:调整systemd的重启策略(仅临时测试)
如果需要保留-d参数,可修改Restart参数为仅在进程失败时重启:
Restart=on-failure
但这种方式下systemd无法监控容器是否真的在运行,容器崩溃时systemd不会感知到,不推荐用于生产环境。
方法3:使用Docker的systemd集成(进阶)
可以使用docker run的--notify参数配合systemd的Type=notify,让容器直接向systemd发送就绪信号,这种方式更优雅,但需要容器支持systemd notify机制:
- 修改systemd服务的
Service段:
Type=notify ExecStart=/usr/bin/docker run --rm -d --notify=systemd -e ROBOT_IP="172.17.0.2" --name rtdeplugin rtdeplugin:latest
- 确保容器内的应用支持发送systemd notify信号(可能需要调整容器镜像)。
内容的提问来源于stack exchange,提问作者Tomasz Drewniak
相关产品推荐
相关产品推荐

