Linux 系统异常触发后自动重启配置指南
一、内核级自动重启配置
适用于内核崩溃(Kernel Panic)、硬件驱动故障等场景,通过 SysRq 和 Watchdog 实现快速恢复。
1. SysRq 强制重启
- 功能:通过触发内核崩溃或强制重启,绕过正常关机流程。
- 配置步骤:
# 启用 SysRq 功能(临时) echo 1 > /proc/sys/kernel/sysrq # 永久生效(编辑 sysctl.conf) sudo vi /etc/sysctl.conf # 添加以下行 kernel.sysrq = 1 sudo sysctl -p # 设置内核崩溃后自动重启时间(示例:10秒) echo 10 > /proc/sys/kernel/panic # 永久配置 echo "kernel.panic = 10" | sudo tee -a /etc/sysctl.conf
- 触发命令:
echo c > /proc/sysrq-trigger # 触发内核崩溃并生成转储(需 kdump) echo b > /proc/sysrq-trigger # 强制重启(跳过数据同步)
2. Watchdog 硬件/软件监控
- 功能:通过定期心跳检测,超时无响应则自动重启。
- 软件 Watchdog 配置:
# 加载模块 sudo modprobe softdog # 设置超时时间(示例:30秒) echo 30 > /proc/sys/kernel/watchdog_thresh # 启动服务 sudo systemctl start watchdog
- 硬件 Watchdog:需主板支持,通过
ipmitool
控制:ipmitool chassis power reset # 硬件级强制重启
二、服务/进程级自动重启
适用于用户态服务崩溃、进程挂起等场景。
1. systemd 服务管理
- 配置示例(
/etc/systemd/service/myapp.service
):[Service] ExecStart=/usr/bin/myapp Restart=always # 任何退出都重启 RestartSec=5s # 间隔 5 秒重启 [Install] WantedBy=multi-user.target
- 生效命令:
sudo systemctl daemon-reload sudo systemctl enable myapp --now
2. Supervisor 进程监控
- 配置示例(
/etc/supervisor/conf.d/myapp.conf
):[program:myapp] command=/usr/bin/myapp autostart=true autorestart=true startretries=3
- 生效命令:
sudo supervisorctl update && sudo supervisorctl start myapp
三、内核崩溃转储与自动重启(kdump)
用于生成崩溃转储文件(vmcore
)后自动重启,便于后续调试。
1. 安装与配置 kdump
- 安装工具:
# Debian/Ubuntu sudo apt install linux-crashdump kexec-tools # CentOS/RHEL sudo yum install kexec-tools
- 预留内存:
编辑/etc/default/grub
,添加crashkernel=512M
:GRUB_CMDLINE_LINUX="... crashkernel=512M" sudo update-grub && sudo reboot
- 配置 kdump(
/etc/kdump.conf
):path /var/crash core_collector makedumpfile -l --message-level 1 -d 31
2. 验证与触发
- 检查服务状态:
sudo systemctl status kdump
- 手动触发转储并重启:
echo c > /proc/sysrq-trigger # 生成 vmcore 后自动重启
四、网络异常自动重启
适用于网络链路中断导致服务不可用。
1. 网络检测脚本
- 脚本示例(
/usr/local/bin/network_check.sh
):#!/bin/bash if ! ping -c 3 8.8.8.8 &> /dev/null; then sudo systemctl reboot fi
- 定时任务(
crontab -e
):*/5 * * * * /usr/local/bin/network_check.sh
五、验证与调试
1. 配置验证
- 检查内核参数:
cat /proc/sys/kernel/sysrq # 应为 1 cat /proc/sys/kernel/panic # 应为设定的重启时间(如 10)
- 查看 kdump 状态:
sudo kdump-config status
2. 日志分析
- 内核日志:
dmesg | grep "Kernel panic" journalctl -k --since "1 hour ago"
- 转储文件分析:
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/xxx/vmcore
六、注意事项
-
数据安全:
- 强制重启可能导致数据丢失,优先使用
sync
同步数据。 - 生产环境建议结合监控系统(如 Zabbix)告警后再操作。
- 强制重启可能导致数据丢失,优先使用
-
硬件兼容性:
- 确保硬件支持 Watchdog 或 IPMI。
-
测试环境验证:
- 在非生产环境中模拟崩溃(如
kill -9
或echo c
)验证流程。
- 在非生产环境中模拟崩溃(如
附录:命令速查表
场景 | 命令/配置 |
---|---|
强制重启 | echo b > /proc/sysrq-trigger |
生成崩溃转储 | echo c > /proc/sysrq-trigger (需配置 kdump) |
服务自动重启 | systemctl edit myapp → 添加 Restart=always |
网络检测重启 | crontab -e → 添加 */5 * * * * /path/to/network_check.sh |
通过上述配置,可覆盖内核崩溃、服务异常、网络中断等多种场景下的自动重启需求,平衡系统稳定性与恢复效率。