news 2026/3/28 9:07:14

Ubuntu触发硬件级系统重启

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu触发硬件级系统重启

Ubuntu触发硬件级系统重启

  • 1. 挂载系统服务
  • 2. 编写GPU状态监控
  • 3. 编写重启函数
    • 3.1 启用内核硬件重启许可
    • 3.2 执行硬重启函数
  • 4. 启用监控服务

因为一些至今尚未搞明白的神奇原因,RTX5090的显卡时不时就会在跑AI推理的时候挂掉(GPU lost),导致整个操作系统都在短时间内跟着一起挂掉。
在windows server上,这会导致整个操作系统自动关机重启,但是在Ubuntu上,这会导致显示器画面卡死在:

nvidia-modeset:ERROR:GPU:0:ERRORwhilewaitingforGPU progres

使用的操作系统:Ubuntu24.04.3
Nvidia驱动:Driver Version: 580.95.05

到现在也不知道为什么会有这个显卡挂掉的问题【在同一台机器的windows server系统上同样会出现这个问题,而且更换了多个版本的驱动都存在,让我不得不怀疑硬件问题】,如果有人能知道可能的原因请麻烦告知一下。

但不论如何,目前的目的是让Ubuntu系统在显卡挂掉的情况下,能够全自动重启恢复。

经过研究,发现系统级的systemd服务在显示器画面已经爆炸的情况下其实还在正常工作,而进一步的研究发现,通过python的GPUtil.getGPUs()可以获取目前还在正常工作的显卡数量,如果这个数量低于正常水平,那么显而易见说明有显卡此时出现了故障掉线了。

这样解决思路就有了,基于在systemd服务中挂载一个root用户启动的python脚本,如果检测到GPU目前的工作数量低于正常水平(比如我的系统中应该是2张),那么就发出指令触发系统重启。

1. 挂载系统服务

在系统服务路径/etc/systemd/system/下,新建一个服务文件gpu_monitor.service

[Unit]Description=gpu_monitorAfter=network.target[Service]User=rootWorkingDirectory=/你的工程路径/gpu_monitorExecStart=/你的用户路径/anaconda3/envs/common/bin/python -u /你的工程路径/gpu_monitor.pyRestart=always[Install]WantedBy=multi-user.target

2. 编写GPU状态监控

编写python代码gpu_monitor.py监控GPU状态:

importtimeimportGPUtilimportsubprocess# 正常情况下的GPU数量NORMAL_GPU_NUM=2# 初始休眠,防止显卡无法恢复的情况下无限重启INIT_SLEEP=120# 检测间隔INTERVAL=60defreboot_system():pass# 系统重启逻辑defmain():gpu_num=len(GPUtil.getGPUs())print(f"Detect GPU num:{gpu_num}, init sleep until start monitor...")# 初始休眠,防止显卡无法恢复的情况下无限重启time.sleep(INIT_SLEEP)whileTrue:try:gpu_num=len(GPUtil.getGPUs())ifgpu_num<NORMAL_GPU_NUM:print(f"GPU lost! GPU num:{gpu_num}")reboot_system()# 重启命令执行后等待一段时间(防止程序提前退出)time.sleep(INTERVAL)else:print("GPU is ok!")exceptExceptionase:print(f"error:{e}")finally:time.sleep(INTERVAL)if__name__=="__main__":main()

3. 编写重启函数

对于如何重启恢复,尝试了很多办法,当然,思路都是基于python和root用户去运行重启命令。
但事实证明rebootshutdown这种软重启在log中能够自动恢复操作系统,但实际显示器上的画面依然停留在故障页面,因此,需要使用硬件层面的重启方式。
最后实验证明,需要使用基于sysrq-trigger的硬重启方式,才能完全恢复系统状态。

3.1 启用内核硬件重启许可

运行命令查看当前内核许可执行的权限:

cat/proc/sys/kernel/sysrq

发现默认输出为176
Linux 内核中 kernel.sysrq 的值是二进制位掩码(每一位对应一个 SysRq 功能),十进制值是所有开启位的数值之和。把 176 转换成二进制,对应的二进制:10110000
对应的权限中不包含重启(十进制2,二进制位序号1)的权限。
因此,如果需要在原本的基础上添加重启权限,则需要设置为176+2=178。

保险起见,不修改原文件,选择覆盖配置文件的参数配置方式:

sudovim/etc/sysctl.d/99-sysrq-reboot.conf

添加行:

kernel.sysrq=178

刷新配置:

sudosysctl --system

查看当前配置:

sudovim/etc/sysctl.d/99-sysrq-reboot.conf

发现在最下面已经多了kernel.sysrq = 178,这会覆盖前面相同名字的参数,此时内核已经允许执行硬件级别重启操作。

3.2 执行硬重启函数

重启对应的命令是b,即向/proc/sysrq-trigger写入b触发。
因此,对应的python函数代码为:

defreboot_system():try:# 同步磁盘(避免数据丢失)print("同步磁盘数据到硬盘...")subprocess.run(["sync"],timeout=10,check=True)exceptsubprocess.CalledProcessErrorase:print(f"磁盘同步失败:{str(e)}")exceptsubprocess.TimeoutExpired:print("磁盘同步超时,仍尝试重启...")exceptExceptionase:print(f"Sync失败:{str(e)}")try:# 写入b触发重启(硬件级)withopen("/proc/sysrq-trigger","w")asf:f.write("b")print("SysRq-b 重启指令已发送!系统即将重启...")exceptPermissionError:print("错误:无 root 权限写入 SysRq 相关文件!")exceptFileNotFoundError:print("错误:内核不支持 SysRq(CONFIG_MAGIC_SYSRQ 未开启)")exceptExceptionase:print(f"SysRq 重启失败:{str(e)}")

4. 启用监控服务

添加服务和开机自启动:

sudosystemctl daemon-reloadsudosystemctlenablegpu_monitor.servicesudosystemctl start gpu_monitor.service

此时,如果脚本检测到系统的GPU发生lost,就会自动重启计算机了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 11:24:50

Percona XtraBackup入门指南:从安装到第一个备份

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式Percona XtraBackup学习环境&#xff0c;包含&#xff1a;1. 分步安装向导 2. 可视化命令生成器(选择备份类型、压缩选项等) 3. 模拟备份/恢复过程动画演示 4. 常见错…

作者头像 李华
网站建设 2026/3/26 19:23:30

5G通信中的锁相环实战应用解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个5G基站锁相环系统仿真演示&#xff0c;展示锁相环在载波同步和时钟恢复中的应用。要求&#xff1a;1. 模拟5G NR信号环境 2. 实现数字锁相环算法 3. 展示相位跟踪过程 4. 测…

作者头像 李华
网站建设 2026/3/15 14:21:26

ModHeader插件在爬虫开发中的5个实战技巧

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个爬虫调试助手工具&#xff0c;集成ModHeader核心功能并扩展&#xff1a;1.预置常见爬虫请求头配置(Googlebot/Baiduspider等) 2.支持请求头随机生成器避免被封禁 3.添加自动…

作者头像 李华
网站建设 2026/3/25 14:14:19

java 中四种引用类型介绍

在java中&#xff0c;对象的引用强度被分为四种&#xff0c;从强到弱一次是&#xff1a;强引用 → 软引用 → 弱引用 → 虚引用 它们都位于 java.lang.ref 包中&#xff0c;主要用于内存管理、缓存设计、避免 OOM 等场景 一、强引用&#xff08;Strong Reference&#xff09; 1…

作者头像 李华
网站建设 2026/3/27 17:33:52

aTeX 学习笔记:学术文档排版

在实际应用中&#xff0c;如果我们仅仅需要完成的是《[[LaTeX学习笔记&#xff1a;文档排版基础]]》中所介绍的那些纯文本排版工作&#xff0c;其实并不一定需要用到 LATEX这样复杂的排版系统。毕竟&#xff0c;LATEX的核心优势主要在于其对数学公式、图表、参考文献等复杂文档…

作者头像 李华
网站建设 2026/3/25 5:42:36

零基础教程:5分钟用AI创建你的第一个抖音录播工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个最简单的抖音直播录制工具demo&#xff0c;要求&#xff1a;1.极简实现(不超过200行代码) 2.只需核心录制功能 3.提供最基础的命令行界面 4.包含最简单的错误提示 5.有清晰…

作者头像 李华