使用systemd 监控服务并实现故障自动重启

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

在生产环境中,服务可能因内存溢出、资源竞争、外部依赖中断等问题意外崩溃。手动恢复效率低下,而 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)能力,进一步降低了运维复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87618.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 React 中使用 WebSockets 构建实时聊天应用程序

实时通信已成为现代 Web 应用程序(尤其是在聊天应用程序中)不可或缺的功能。实时通信提供了一种强大的方法来实现客户端和服务器之间的实时双向通信。在本指南中,我们将逐步讲解如何使用React WebSockets构建实时聊天应用程序。 先决条件 在…

实验五-Flask的简易登录系统

一、实验目的和任务 1.掌握Flask框架的基本使用方法 2.理解Web应用的会话管理机制 3.实现用户认证系统的基本功能 4.学习模板继承和表单处理技术 要求:请将思考题的答案写在实验报告中 二、实验内容 1.基础环境搭建:创建项目目录结构、安装必要依赖包…

WebSocket类明明注入了Bean,为什么报错为null

在 WebSocket 类中注入 Bean 看似可行而注入 Bean 报错为null,通常是由于Spring 的单例管理机制与 WebSocket 多实例创建特性冲突导致的,具体分析如下:原因分析Spring 的单例特性:Spring 默认以单例模式管理 Bean,即一…

Python 爬虫开发指南:从基础到实战

在大数据时代,数据成为了宝贵的资源。Python 爬虫作为高效获取网络数据的工具,受到越来越多开发者的关注。本文将详细介绍 Python 爬虫的相关知识,助你快速入门并掌握爬虫开发的核心要点。 一、Python 爬虫概述 Python 爬虫,即网…

99、git 超时问题

报错: Push failed ssh: connect to host github.com port 22: Connection timed out Could not read from remote repository

CountDownLatch 详细介绍

CountDownLatch 是 Java 中 java.util.concurrent 包提供的一个同步工具类,用于协调多个线程之间的执行顺序。它允许一个或多个线程等待,直到其他线程完成一组操作后继续执行。CountDownLatch 是一种倒计数锁存器,通过设置一个初始计数器值&a…

Hadoop之HDFS

Hadoop之HDFS HDFS的Shell操作 启动Hadoop集群(方便后续测试) [atguigu@hadoop102 ~]$ sbin/start-dfs.sh [atguigu@hadoop102 ~]$ sbin/start-yarn.sh-help:输出这个命令参数 [atguigu@hadoop102 ~]$ hadoop fs -help rm-ls:显示目录信息 [atguigu@hadoop102 ~]$ hadoop …

【1.4 漫画PostgreSQL高级数据库及国产数据库对比】

🐘 漫画PostgreSQL高级数据库及国产数据库对比 👨‍💻 小明:“老王,除了MySQL,还有哪些优秀的关系型数据库?国产数据库发展得怎么样?” 🧙‍♂️ 架构师老王:…

OLT、ONU、ONT、SFU、HGU、ODN,它们是什么?它们之间有什么区别?

我们经常会看到OLT、ONU、ONT、SFU、HGU等设备术语。它们分别是什么?又有什么区别呢? PON组件:OLT、ONU、ONT和ODN 无源光网络(PON)采用光纤和分路器,以点对多点拓扑将数据从单一源分发到多个用户。与有源光网络 (AON)不同,PON 仅在光域中运行&#…

sql USING 简化 JOIN 操作

在 SQL 中,USING 是一种用于简化 JOIN 操作的语法糖,它允许你明确指定连接表时所依据的列名。与传统的 ON 子句相比,USING 提供了更简洁的语法1. 基本语法与作用table1 JOIN table2 USING (column_name);将 table1 和 table2 中 column_name …

android开发中的 AndroidX 版本的查看 及 constraintLayout的简单用法

1、查看库的版本 平常我们经常会用到一些库,但是不知道是什么版本,也不知道最新的是什么版本,当然最好的就是到官网去查看,或者三方的maven库。 2、官方地址 AndroidX 版本 | Jetpack | Android Developers 3、比如我们来…

oracle锁表,oracle解锁表,oracle用户连接数

一、查看被锁的表 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id lo.object_id and lo.session_id sess.sid; 二、解锁表语句 alter …

3D可视化:开启多维洞察新时代

3D可视化技术以一种前所未有的方式,将数据、模型与现实世界紧密相连,为人们带来了沉浸式、交互式的全新体验,彻底革新了信息的呈现与理解方式。一、3D可视化的技术原理从技术本质来看,3D可视化基于一系列复杂而精妙的原理。通过数…

List中的对象进行排序处理

以下是使用 Java Stream 对对象列表按 id 和 age 排序的完整示例,包含升序和降序两种场景: 1. 定义测试对象类 Getter Setter public class Person {private int id;private int age; }2. 排序实现代码 import java.util.*; import java.util.stream.…

秋招Day14 - Redis - 底层结构

Redis都有哪些底层数据结构? 有八种核心的底层数据结构。 SDS Redis自己实现的动态字符串,SDS结构中直接存储了已使用的字符数组长度len和未使用的字符数组长度free,所以获取长度的时间复杂度是O(1),还支持动态扩容&#xff0c…

使用Mac自带的图像捕捉导出 iPhone 相册

用 数据线 将 iPhone 连接到 Mac必须是数据线,有些充电线插上去后无法识别到iphone在 iPhone 上点击“信任此电脑”在 Mac 上打开应用:快速方式:按 Command Space 打开 Spotlight,输入 图像捕捉 或 Image Capture,回车或者从 /系…

【UniApp picker-view 多列对齐问题深度剖析与完美解决】

UniApp picker-view 多列对齐问题深度剖析与完美解决一次看似简单的样式调整,却引发了对构建工具、CSS 预处理和组件渲染机制的深度思考创作时间: 2025/7/1 技术栈: UniApp Vue3 TypeScript PostCSS 问题级别: 🔴 高级🎯 问题背景 在开发 …

R Studio开发中记录

1.如何将tar.gz格式的源码R包编译为zip格式的二进制R包。 R CMD INSTALL --build knhanes.tar.gz R CMD INSTALL --build nhanes.tar.gz 2.下载RTools RTools: Toolchains for building R and R packages from source on Windows 3.修改环境变量 PATH$PATH:/d/rtools45/usr…

量化交易中的隐藏模式识别:基于潜在高斯混合模型的机会挖掘

*——从市场噪声中提取黄金信号的数学艺术** > 2025年3月,某对冲基金使用潜在高斯混合模型捕捉到铜期货的异常波动模式,提前布局实现单月收益47%。核心代码仅20行,却颠覆了传统技术分析范式。 --- ### 01 市场迷思:为何90%的交易者失败? 金融市场本质是**非…

Qt窗口被外部(非Qt内部机制)强制销毁,第二次再重复使用不显示

在Qt开发中,窗口被外部(非Qt内部机制)强制销毁 警告信息 External WM_DESTROY received for QWidgetWindow(0x108b8cbdb10, name"xxxxx") , parent: QWindow(0x0) , transient parent: QWindow(0x0) 使用场景 代码结构如下&#x…