使用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 # 立即启动
四、故障排查技巧
查看实时状态:
systemctl status your-service # 检查运行状态和最近错误
追踪日志:
journalctl -u your-service -f # 实时日志
测试自动重启:
sudo kill -9 $(pgrep -f "app.jar") # 模拟崩溃
systemctl status your-service # 确认是否在30秒后重启
️ 五、避坑指南
- 权限问题:若服务以非 root 用户运行,需确保该用户对文件路径有读写权限。
- 环境变量缺失:通过
Environment显式声明变量(如JAVA_HOME)。 - 资源泄漏:频繁重启可能加剧资源消耗,建议结合
cgroups限制内存/CPU:MemoryLimit=1G # 限制内存为1GB
CPUQuota=80% # 限制CPU使用率
六、进阶技巧
- 多实例服务:使用模板创建多个实例(如
app@1.service、app@2.service)。 - 安全隔离:启用沙盒模式增强安全性:
PrivateTmp=true # 独立临时目录
ProtectSystem=strict # 禁止写入系统文件
- 看门狗机制:配合
WatchdogSec=30实现应用级心跳检测。
总结
> systemd 的自动重启不是简单的“重启开关”,而是融合了熔断机制、依赖管理、资源隔离的企业级运维方案。
通过合理配置 Restart 策略与资源限制,可将服务停机时间缩短至秒级,同时避免崩溃循环引发的雪崩效应。其日志集成(journalctl)和状态监控(systemctl status)能力,进一步降低了运维复杂度。
行动建议:
下次部署服务时,别再用nohup了!花 5 分钟写一个 systemd 单元文件,让系统自动守护你的进程。
使用systemd 监控服务并实现故障自动重启的更多相关文章
- zabbix通过curl命令判断web服务是否正常并自动重启服务
zabbix通过curl命令判断web服务是否正常并自动重启服务 主要思路: 通过curl命令获取服务器响应码,如果正常返回200,不正常返回000 具体命令: curl -I -s -w " ...
- linux上监控tomcat down掉后自动重启tomcat
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...
- 用monit监控mongodb,崩溃后自动重启mongdb
什么是monit Monit是一个跨平台的用来监控Unix/linux系统(比如Linux.BSD.OSX.Solaris)的工具.Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不 ...
- <记录> PHP监控进程状态,完成掉线自动重启
1. 利用Shell脚本实现 #!/bin/bash PORT= while [ true ];do read -p "please enter the port that you want ...
- windows service自动重启服务
服务一般都能正常的运行,但有时候也会有一些假死现象,比如公司有一考勤服务就因为依赖于硬件厂家的api, 但厂家api运行一段时间后会默名的假死,引起整个服务假死,因为这一假死现象具有不确定性,所以不太 ...
- 监控windows服务,当服务停止后自动重启服务
近期花时间研究了一下windows和linux下某服务停了后自动重启的功能,在网上收集了些资料,并经过测试,在此整理一下.这里介绍的是windows服务的监控,是通过批处理来实现的.本例是监控wind ...
- systemd实践: 依据情况自动重启服务【转】
1.最简单的自动重启范例 [Unit] Description=mytest [Service] Type=simple ExecStart=/root/mytest.sh Restart=alway ...
- systemd实践: 依据情况自动重启服务
systemd服务异常自动重启很好用,但有的时候希望某些服务只在特定情况下进行重启,其他时候不要自动重启(比如OOM,需要人工介入). 本文抛砖引玉,旨在能够让读者对systemd的重启机制有一定了解 ...
- Linux之systemd服务配置及自动重启
layout: post title: Linux之systemd服务配置及自动重启 date: 2019-09-09 tags: linux --- Linux之systemd服务配置及自动重启 0 ...
- zabbix监控服务部署
目录 zabbix监控服务部署 1. zabbix介绍 1.1 zabbix的组件 1.2 zabbix的进程 1.3 zabbix常用术语 2. zabbix工作原理 3. zabbix监控架构 4 ...
随机推荐
- 【Linux】5.7 Shell test命令
Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 1. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 - ...
- 正在开发的.net sql拼写神器
我正在开发的一个.net sql拼写工具,当然也可以算是ORM 该工具的作用就是帮忙码农拼写sql,对标开源项目SqlKata.该工具最适合搭配Dapper使用,所以附带了一个Dapper扩展.当然直 ...
- 搭建Trae+Vue3的AI开发环境
从2024年2025年,不断的有各种AI工具会在自媒体中火起来,号称各种效率王炸,而在AI是否会替代打工人的话题中,程序员又首当其冲. 作为一个后端开发,这篇文章基于Trae工具,来创建和运行一个简单 ...
- python调用QQ机器人向指定QQ发消息
暂时没想到这个能用来干什么,只是刚好看到相关文章,学习一下,就拿获取基金信息来做试验把 爬取基金的信息就不介绍了,请参考https://www.cnblogs.com/becks/p/14500495 ...
- python,循环中通过判断条件中止循环的方法(braek 语句)
直接对下方代码进行解析 for a in range(5): print(a) if a == 2: break 依次读取range内的数字,并答应出来.当读取出来的数字是2时,结束循环,执行后入下图 ...
- 康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案
随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要.BEV(Bird's-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点. 一 ...
- Python requests代理(Proxy)使用教程
Python requests代理(Proxy)使用教程 在 Python 的 requests 库中,使用代理服务器可以让你通过不同的网络路由发送 HTTP 请求.代理服务器可以帮助隐藏真实 IP ...
- blk_mq多队列块设备浅析
1. 为什么要使用多队列 在主机中,多cpu运行多个线程,每个线程都能和文件系统交互,文件系统层也是用多线程和bio层交互,但是,块设备层只有一个队列: 在块设备层,来自多个cpu的bio请求被放在同 ...
- Python—Pytorch学习-RNN(一)
前言 有好几个月没搞神经网络代码了,期间也就是回顾了两边之前的文字. 不料,对nn,cnn的理解反而更深入了-_-!. 修改 <零基础学习人工智能-Python-Pytorch学习(四)> ...
- SpringMVC返回值
字符串 /** * 测试返回字符串 * @param model model * @return 返回的字符串,通过视图解析器调整到jsp页面 */ @RequestMapping("/te ...