一、为什么需要自动重启?

在生产环境中,服务可能因内存溢出、资源竞争、外部依赖中断等问题意外崩溃。手动恢复效率低下,而 systemd 的自动重启机制可在秒级内恢复服务,显著提升系统可用性。


⚙️ 二、systemd 自动重启的核心配置

1. 服务文件关键参数

/etc/systemd/system/your-service.service 中定义以下参数:

[Service]
Restart=on-failure # 服务异常退出时重启(推荐)
RestartSec=10s # 重启前等待时间(避免频繁重启)
StartLimitIntervalSec=300 # 300秒内最多重启次数
StartLimitBurst=5 # 最多尝试5次重启

2. 重启策略详解

策略 适用场景
Restart=on-failure 服务因错误(非零退出码)终止时重启,适合需手动干预的场景(如调试)
Restart=always 无条件重启(包括正常退出),适用于数据库、Web服务器等关键服务

3. 防崩溃保护机制

StartLimitIntervalSec=60
StartLimitBurst=3

若服务在 60秒内崩溃超过3次,systemd 将停止重启并标记为失败状态,防止资源耗尽。


️ 三、实战配置示例(以Spring Boot应用为例)

[Unit]
Description=Spring Boot Application
After=network.target postgresql.service # 依赖网络和数据库 [Service]
User=appuser
ExecStart=/usr/bin/java -jar /opt/app.jar
Restart=on-failure
RestartSec=30s
Environment="DB_URL=jdbc:postgresql://localhost/db"
StartLimitIntervalSec=300
StartLimitBurst=5 # 日志重定向(可选)
StandardOutput=file:/var/log/myapp.log
StandardError=file:/var/log/myapp-error.log [Install]
WantedBy=multi-user.target

操作命令

sudo systemctl daemon-reload              # 重载配置
sudo systemctl enable your-service # 开机自启
sudo systemctl start your-service # 立即启动

四、故障排查技巧

  1. 查看实时状态

    systemctl status your-service  # 检查运行状态和最近错误
  2. 追踪日志

    journalctl -u your-service -f  # 实时日志
  3. 测试自动重启

    sudo kill -9 $(pgrep -f "app.jar")  # 模拟崩溃
    systemctl status your-service # 确认是否在30秒后重启

️ 五、避坑指南

  1. 权限问题:若服务以非 root 用户运行,需确保该用户对文件路径有读写权限。
  2. 环境变量缺失:通过 Environment 显式声明变量(如 JAVA_HOME)。
  3. 资源泄漏:频繁重启可能加剧资源消耗,建议结合 cgroups 限制内存/CPU:
    MemoryLimit=1G   # 限制内存为1GB
    CPUQuota=80% # 限制CPU使用率

六、进阶技巧

  • 多实例服务:使用模板创建多个实例(如 app@1.serviceapp@2.service)。
  • 安全隔离:启用沙盒模式增强安全性:
    PrivateTmp=true         # 独立临时目录
    ProtectSystem=strict # 禁止写入系统文件
  • 看门狗机制:配合 WatchdogSec=30 实现应用级心跳检测。

总结

> systemd 的自动重启不是简单的“重启开关”,而是融合了熔断机制、依赖管理、资源隔离的企业级运维方案。

通过合理配置 Restart 策略与资源限制,可将服务停机时间缩短至秒级,同时避免崩溃循环引发的雪崩效应。其日志集成(journalctl)和状态监控(systemctl status)能力,进一步降低了运维复杂度。

行动建议

下次部署服务时,别再用 nohup!花 5 分钟写一个 systemd 单元文件,让系统自动守护你的进程。

使用systemd 监控服务并实现故障自动重启的更多相关文章

  1. zabbix通过curl命令判断web服务是否正常并自动重启服务

    zabbix通过curl命令判断web服务是否正常并自动重启服务 主要思路: 通过curl命令获取服务器响应码,如果正常返回200,不正常返回000 具体命令: curl -I -s -w " ...

  2. linux上监控tomcat down掉后自动重启tomcat

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  3. 用monit监控mongodb,崩溃后自动重启mongdb

    什么是monit Monit是一个跨平台的用来监控Unix/linux系统(比如Linux.BSD.OSX.Solaris)的工具.Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不 ...

  4. <记录> PHP监控进程状态,完成掉线自动重启

    1. 利用Shell脚本实现 #!/bin/bash PORT= while [ true ];do read -p "please enter the port that you want ...

  5. windows service自动重启服务

    服务一般都能正常的运行,但有时候也会有一些假死现象,比如公司有一考勤服务就因为依赖于硬件厂家的api, 但厂家api运行一段时间后会默名的假死,引起整个服务假死,因为这一假死现象具有不确定性,所以不太 ...

  6. 监控windows服务,当服务停止后自动重启服务

    近期花时间研究了一下windows和linux下某服务停了后自动重启的功能,在网上收集了些资料,并经过测试,在此整理一下.这里介绍的是windows服务的监控,是通过批处理来实现的.本例是监控wind ...

  7. systemd实践: 依据情况自动重启服务【转】

    1.最简单的自动重启范例 [Unit] Description=mytest [Service] Type=simple ExecStart=/root/mytest.sh Restart=alway ...

  8. systemd实践: 依据情况自动重启服务

    systemd服务异常自动重启很好用,但有的时候希望某些服务只在特定情况下进行重启,其他时候不要自动重启(比如OOM,需要人工介入). 本文抛砖引玉,旨在能够让读者对systemd的重启机制有一定了解 ...

  9. Linux之systemd服务配置及自动重启

    layout: post title: Linux之systemd服务配置及自动重启 date: 2019-09-09 tags: linux --- Linux之systemd服务配置及自动重启 0 ...

  10. zabbix监控服务部署

    目录 zabbix监控服务部署 1. zabbix介绍 1.1 zabbix的组件 1.2 zabbix的进程 1.3 zabbix常用术语 2. zabbix工作原理 3. zabbix监控架构 4 ...

随机推荐

  1. javascript 判断浏览器

    navigator.userAgent 通常我们可以通过navigator.userAgent只读属性来获取浏览器的一些信息,算是原生方法吧. jquery -jquery1.9 版本可以通过$.br ...

  2. 学习Kotlin语法(四)

    简介 在上一节,我们对Kotlin中函数的相关知识有了大致的了解,本章节我们将去了解一些Kotlin中的作用域函数. 目录 let:处理可空对象,链式操作 run:对象配置 + 计算返回值 with: ...

  3. GPT-SoVITS Windows 配置与推理笔记(自用)

    GPT-SoVITS Windows 配置与推理笔记(自用) 这是给自己留的备份,方便下次查.Windows 端配置和推理为主,代码为核心,直接干货. 环境准备 系统:Windows 10/11 Py ...

  4. 基于transformer的机器翻译:手把手教你实现

    目录 前言 transformer模型的搭建 Input embedding Encoder Decoder output transformer构建 data数据集处理 train config 参 ...

  5. vue2鼠标事件

    1.单击 @click 2.按下 @mousedown 3.抬起 @mouseup 4.双击 @dblclick 5.移动 @mousemove 6.移除 @mouseout 7.离开 @mousel ...

  6. SpringBoot整合JDBC--数据源

    目录 1 新建SpringBoot项目 1.1 导入pom依赖文件 2 通过@PropertySource注解读取配置文件 2.1 新建jdbc.properties文件 2.2 新建配置类,加载配置 ...

  7. linux期末考试题(1)

    linux期末考试题 一.选择题(共20分,每小题2分) 1.以下哪个环境变量表示shell搜索外部命令或程序路径(C) A.ENV B.PWD C.PATH D.ROOT 解答: ENV用于显示当前 ...

  8. 如何开启AI副业,月入10w? 想听的速来!!

    提供AI咨询+AI项目陪跑服务,有需要回复1 最近几天与粉丝多有交流,他们或者是经理.或者是总监,甚至有粉丝手里已经掌握了公司一些预算使用权. 从他们身上反映出了同一个问题:他们对于AI是偏焦虑的,想 ...

  9. 【UEFI】PEI阶段从概念到代码

    总述 UEFI开发过程中,BIOS工程师主要关注点和工作都在于PEI和DXE阶段. DXE阶段是我们的主战场,可以进行丰富且大量的功能驱动开发. 实际上,在UEFI Spec中,就指出 ---- Th ...

  10. 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案

    今天在使用国产数据库金仓时,我发现每次遇到问题都习惯性地打开金仓社区进行搜索和查看相关信息.可是每次打开浏览器的操作总让我觉得有些麻烦,于是我决定不再依赖这种繁琐的过程.索性今天我把这个接口提取出来, ...