You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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机制:

  1. 修改systemd服务的Service段:
Type=notify
ExecStart=/usr/bin/docker run --rm -d --notify=systemd -e ROBOT_IP="172.17.0.2" --name rtdeplugin rtdeplugin:latest
  1. 确保容器内的应用支持发送systemd notify信号(可能需要调整容器镜像)。

内容的提问来源于stack exchange,提问作者Tomasz Drewniak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:55:03