systemd-resolved.service实验实战3

Systemd 设计模式:CrashGuard (防止无限重启)

痛点 (The Problem):

你给服务设置了 Restart=always,但程序有 Bug,启动后 1 秒即崩。
后果:Systemd 陷入死循环(重启风暴),CPU 飙升 100%,日志塞满磁盘,甚至导致无法 SSH 登录。

解法 (The Solution):

不要无脑重启。限制频率 ,并在彻底失败后触发备用方案

1. 核心机制 (背下这 3 个参数)

  • StartLimitIntervalSec: 时间窗口 (例如 10秒)。
  • StartLimitBurst: 允许崩溃的最大次数 (例如 3次)。
  • OnFailure: 当达到限制后,Systemd 放弃重启,转而启动的服务。

2. 实战配置

服务 A:不稳定的主程序 (受害者)

/etc/systemd/system/unstable-app.service

ini 复制代码
[Unit]
Description=My Buggy App
# 【规则】如果在 10秒 内崩溃超过 3次...
StartLimitIntervalSec=10
StartLimitBurst=3
# 【动作】彻底停止尝试,并启动下面这个服务:
OnFailure=safe-mode.service

[Service]
# 模拟崩溃 (1秒后退出)
ExecStart=/bin/bash -c "sleep 1 && exit 1"
Restart=always
RestartSec=1
服务 B:安全模式 (救世主)

/etc/systemd/system/safe-mode.service

ini 复制代码
[Unit]
Description=Safe Mode Alert

[Service]
Type=oneshot
# SE 的自救动作:点亮红灯、发短信报警、或者回滚分区
ExecStart=/bin/echo "CRITICAL: 检测到重启风暴,已进入安全模式!"

3. 运行流程 (The Flow)

  1. 启动 : unstable-app 启动 -> 崩溃
  2. 重试 1 : Systemd 重启它 -> 崩溃
  3. 重试 2 : Systemd 重启它 -> 崩溃
  4. 触发阈值 : Systemd 发现 "10秒内崩了3次"。强制停止 unstable-app
  5. 故障转移 : Systemd 自动启动 safe-mode.service

SE 经验总结:

永远不要只写 Restart=always 而不加 StartLimit

这是"偶尔故障"和"设备变砖"之间的区别。

相关推荐
blasit4 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
YuMiao10 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
肆忆_1 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
chlk1231 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑1 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件1 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
不想写代码的星星1 天前
虚函数表:C++ 多态背后的那个男人
c++
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github