linux调试内核工具实证记录—sysrq-trigger
- 概述
- 基本功能
- 使用方法
- 使用实例详细说明
- 1.显示帮助信息(h)
- 2.日志等级loglevel (0-9)
- 3. 立即重启机器(b)
- 4. 系统崩溃(c)
- 5. 发出 SIGTERM 信号(e)
- 6.杀死内存的 hog 进程
- 7. 发出 SIGKILL 信号 (i)
- 8. 解冻被 FIFREEZE ioctl 冻结的文件系统(j)
- 9. 杀死所有当前虚拟控制台中的程序(k)
- 10. 显示所有活动 CPU 的堆栈回溯(l)
- 11. 显示当前内存信息 (m)
- 12. 使实时任务可以设置 nice 值(n)
- 13. 关闭系统(o)
- 14. 显示寄存器 (p)
- 15. 显示所有定时器 (q)
- 16. 同步所有已挂载的文件系统(s)
- 17.显示当前任务的列表 (t)
- 18. unmount (u)
- 19. show-blocked-tasks (w)
- 20. dump-ftrace-buffer (z)
- 注意事项
- 参考资料
概述
/proc/sysrq-trigger
是 Linux 内核提供的一种强大的调试和故障排除工具,允许用户通过写入特定命令来触发系统请求(SysRq)功能,类似Windows系统卡了之后我们通常会通过ctrl+alt+delete
按键来进行任务管理的操作。以下是在Ubuntu 18.04.6 LTS版本的系统上对它进行的实证,具体的执行结果需结合您自己的结果,仅供参考:
基本功能
/proc/sysrq-trigger
提供了与系统进行低级别交互的方法,通常用于系统恢复和调试任务。通过它,用户可以在没有物理键盘的情况下,通过命令行实现各种 SysRq 操作。
使用方法
-
确保 SysRq 功能已启用
查看 SysRq 功能是否启用,运行
cat /proc/sys/kernel/sysrq
,若输出为非0则已启用;若为 0,可通过echo 1 | sudo tee /proc/sys/kernel/sysrq
启用。/proc/sys/kernel/sysrq数值的含义如下:bit号 含义 1(0x1) 允许的 sysrq 功能的位掩码 2(0x2) 启用对控制台日志级别的控制 4(0x4) 启用对键盘的控制(如 SAK、unraw) 8(0x8) 启用调试转储(例如进程等的调试转储) 16(0x10) 启用同步命令 32(0x20) 启用重新只读挂载 64(0x40) 启用向进程发送信号(如 term、kill、oom-kill) 128 (0x80) 允许重启 / 关机 256 (0x100) 允许对所有实时任务进行调整优先级 为使设置在重启后保持,可在
/etc/sysctl.conf
文件中添加kernel.sysrq = 1
,然后运行sudo sysctl -p
使更改生效。 -
触发 SysRq 命令:使用
echo
命令将特定命令写入/proc/sysrq-trigger
来触发相应的 SysRq 功能。例如,echo m | sudo tee /proc/sysrq-trigger
可将当前内存信息 dump 到终端。
使用实例详细说明
1.显示帮助信息(h)
- 命令
echo h | sudo tee /proc/sysrq-trigger
- 示例
帮助信息(HELP)详细说明如下表:
命令 | 功能 | 使用场景 |
---|---|---|
number(0~9) | 设置控制台日志级别,控制哪些内核消息将打印到控制台。(例如,“0”将使只有紧急消息如 PANIC 或 OOPS 才能打印到控制台) | 需要控制内核消息输出的详细程度时使用,例如在问题排查、调试等过程中 |
b | 立即重启机器,不会将缓冲区同步到硬盘,也不会卸载已挂载的硬盘 | 系统处于严重故障状态,需要快速重启 |
c | 使系统崩溃,如果配置了 crashdump,崩溃后会生成 dump 文件 | 用于内核调试或故障分析时,需要触发系统崩溃来生成 dump 文件 |
e | 向系统中除 init 外的所有进程发出 SIGTERM 信号 | 系统需要重启或关闭,但某些进程无法正常终止时 |
f | 调用 oom_kill 杀死内存的 hog 进程 | 系统内存耗尽,导致系统运行缓慢或无法正常工作时 |
h | 显示帮助信息 | 查看支持的命令 |
i | 向系统中除 init 外的所有进程发出 SIGKILL 信号 | 系统需要重启或关闭,但某些进程无法通过 SIGTERM 信号终止时 |
j | 强制解冻被 FIFREEZE ioctl 冻结的文件系统 | 文件系统被 FIFREEZE ioctl 冻结,需要手动解冻时 |
k | 杀死所有当前虚拟控制台中的程 | 当某个虚拟控制台被恶意程序占用时,可用于清除该控制台上的程序 |
l | 显示现在所有活动 cpu 的堆栈 | 用于内核调试,分析系统中各 CPU 的运行状态 |
m | 将当前内存信息 dump 到终端 | 需要查看当前内存使用情况,用于故障排查或性能分析时 |
n | 用来使实时任务可以设置 nice 值 | 用于实时任务的调度管理,调整实时任务的优先级 |
o | 关闭系统 | 系统需要紧急关闭时 |
p | 将寄存器和 flags dump 到终端 | 用于内核调试,查看当前 CPU 寄存器和标志的状态 |
q | 显示所有定时器 | 用于分析系统中定时器的运行情况,帮助调试和优化定时器相关的代码 |
r | 关闭键盘的 raw 模式,设置为 XLATE 模式 | 键盘处于 raw 模式时,可能无法正常响应某些输入,此时可用于恢复键盘的正常模式 |
s | 将尝试同步所有已挂载的文件系统 | 在系统重启或关闭前,确保所有数据都已写入磁盘 |
t | 将当前任务的列表和他们信息输出到终端 | 用于查看系统中当前的进程状态,帮助调试和分析系统性能问题 |
u | 强制卸载文件系统 | 文件系统处于不正常状态时,用于强制卸载 |
w | 显示被阻塞的任务 | 用于分析系统中被阻塞的进程,帮助排查死锁等问题 |
z | 转储 ftrace 缓冲区的内容 | 用于分析内核的动态跟踪信息,帮助调试内核性能问题 |
2.日志等级loglevel (0-9)
- 功能描述:用于调整内核的打印级别,设置内核消息的日志级别。
- 使用场景:当需要控制内核消息输出的详细程度时使用,例如在问题排查、调试等过程中。
- 命令示例:
echo 8 | sudo tee /proc/sysrq-trigger
(将打印级别设置为 8,显示所有信息)
由上可知日志级别最终设置到/proc/sys/kernel/printk中的第一个值 <console_loglevel>
控制当前控制台的日志级别,只有高于或等于此级别的日志才会被输出到控制台 。级别的具体含义如下表:
级别 | 含义 | 说明 |
---|---|---|
0 | KERN_EMERG | 紧急情况,系统可能不可用。 |
1 | KERN_ALERT | 必须立即采取行动的情况。 |
2 | KERN_CRIT | 严重错误,可能导致系统崩溃。 |
3 | KERN_ERR | 普通错误,例如设备错误或资源耗尽。 |
4 | KERN_WARNING | 警告信息,显示潜在的问题。 |
5 | KERN_NOTICE | 通知信息,通常用于正常但重要的事件。 |
6 | KERN_INFO | 信息性消息,提供有关系统状态的信息。 |
7 | KERN_DEBUG | 调试信息,用于开发和调试过程。 |
8 | KERN_INFO | 信息性消息,提供有关系统状态的信息(与 6 相同)。 |
9 | KERN_DEBUG | 调试信息,用于开发和调试过程(与 7 相同)。 |
3. 立即重启机器(b)
- 功能描述:立即重启机器,不会将缓冲区同步到硬盘,也不会卸载已挂载的硬盘。
- 使用场景:系统处于严重故障状态,需要快速重启。
- 命令示例:
echo b | sudo tee /proc/sysrq-trigger
输入命令后直接黑屏,迅速重启,以前操作的记录也不能看到,说明缓冲区直接丢失了。
4. 系统崩溃©
- 功能描述:使系统崩溃,如果配置了 crashdump,崩溃后会生成 dump 文件。
- 使用场景:用于内核调试或故障分析时,需要触发系统崩溃来生成 dump 文件。
- 命令示例:
echo c | sudo tee /proc/sysrq-trigger
输入后系统直接崩溃,在嵌入式终端中会自动重新启动,但是虚拟机中没有自动重启(具体原因未知),且卡死了,最终通过电脑重启解决的。。。。。
5. 发出 SIGTERM 信号(e)
- 功能描述:向系统中除 init 外的所有进程发出 SIGTERM 信号,请求它们终止。
- 使用场景:系统需要重启或关闭,但某些进程无法正常终止时。
- 命令示例:
echo e | sudo tee /proc/sysrq-trigger
可以登录通过ps -ax命令可发现实际运行的进程都是init内的。
6.杀死内存的 hog 进程
- 功能描述:调用oom killer(Out Of Memory killer)内核机制,oom_kill 杀死 hog 进程(当一个进程申请了大量的内存空间,而且长时间不释放,或者由于内存泄漏等问题不断占用更多内存,使得系统内存资源紧张,就可能被称为内存 hog 进程)。
- 使用场景:系统内存耗尽,导致系统运行缓慢或无法正常工作时。
- 命令示例:
echo f | sudo tee /proc/sysrq-trigger
操作记录的日志较多,下面会摘要说明一下:
[ 469.278564] sysrq: Manual OOM execution#表示手动触发了 OOM Killer
[ 469.278736] kworker/6:4 invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=-1, oom_score_adj=0#内核工作队列进程触发了 OOM Killer
[ 469.278738] CPU: 6 PID: 2691 Comm: kworker/6:4 Not tainted 5.4.0-84-generic #94~18.04.1-Ubuntu #第 6 个 CPU 核心上触发 OOM Killer 的进程 ID,
[ 469.278739] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020#硬件信息是虚拟机的型号和 BIOS 版本
....
[ 469.278765] Mem-Info:#1.内存状态
[ 469.278768] active_anon:215918 inactive_anon:6736 isolated_anon:0
active_file:89139 inactive_file:65543 isolated_file:0
unevictable:4 dirty:20 writeback:0 unstable:0
slab_reclaimable:18956 slab_unreclaimable:23523
mapped:62518 shmem:7103 pagetables:10934 bounce:0
free:1508470 free_pcp:2633 free_cma:0
#每个内存节点(NUMA 架构中的内存区域)的详细内存状态
[ 469.278770] Node 0 active_anon:863672kB inactive_anon:26944kB active_file:356556kB inactive_file:262172kB unevictable:16kB isolated(anon):0kB isolated(file):0kB mapped:250072kB dirty:80kB writeback:0kB shmem:28412kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB writeback_tmp:0kB unstable:0kB all_unreclaimable? no
#2.内存分配(每个节点)
[ 469.278770] Node 0 DMA free:15872kB min:132kB low:164kB high:196kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB writepending:0kB present:15988kB managed:15904kB mlocked:0kB kernel_stack:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[ 469.278773] lowmem_reserve[]: 0 2948 7867 7867 7867
.....#省略
[ 469.278790] 161790 total pagecache pages
[ 469.278791] 0 pages in swap cache
[ 469.278792] Swap cache stats: add 0, delete 0, find 0/0
[ 469.278792] Free swap = 2097148kB
[ 469.278792] Total swap = 2097148kB
[ 469.278793] 2097005 pages RAM
[ 469.278793] 0 pages HighMem/MovableOnly
[ 469.278793] 65921 pages reserved
[ 469.278793] 0 pages cma reserved
[ 469.278794] 0 pages hwpoisoned
[ 469.278794] Tasks state (memory values in pages):
#3.任务状态
[ 469.278794] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
[ 469.278807] [ 432] 0 432 17625 2332 176128 0 0 systemd-journal
[ 469.278808] [ 455] 0 455 26475 443 94208 0 0 lvmetad
[ 469.278810] [ 457] 0 457 11867 1418 118784 0 -1000 systemd-udevd
[ 469.278812] [ 545] 0 545 39696 75 77824 0 0 .......#省略
#4. OOM Killer 决策
sudo
[ 469.279009] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=gnome-shell,pid=2363,uid=1000
[ 469.279100] Out of memory: Killed process 2363 (gnome-shell) total-vm:3804628kB, anon-rss:107304kB, file-rss:90076kB, shmem-rss:64kB, UID:1000 pgtables:1736kB oom_score_adj:0
#5. OOM Reaper 清理被杀死的进程占用的内存
[ 469.285280] oom_reaper: reaped process 2363 (gnome-shell), now anon-rss:0kB, file-rss:4kB, shmem-rss:92kB
1).内存状态
active_anon
:活动的匿名内存页(如进程的堆栈和数据)。inactive_anon
:不活动的匿名内存页。active_file
:活动的文件映射内存页。inactive_file
:不活动的文件映射内存页。unevictable
:不能被回收的内存页。dirty
:脏数据页(尚未写入磁盘的缓存数据)。writeback
:正在写入磁盘的缓存数据。slab_reclaimable
:可回收的内存页。slab_unreclaimable
:不可回收的内存页。mapped
:已映射的内存页。shmem
:共享内存页。pagetables
:页面表占用的内存。free
:空闲内存页。
2).内存分配(每个节点)
DMA
:直接内存访问内存区域。free
:空闲内存。min
、low
、high
:这些值用于内核内存管理,表示内存压力的不同阈值。
3).任务状态
pid
:进程 ID。uid
:用户 ID。tgid
:线程组 ID。total_vm
:进程的虚拟内存总大小。rss
:常驻内存大小(驻留在物理内存中的页数)。pgtables_bytes
:页面表占用的内存大小。swapents
:交换分区的使用量。oom_score_adj
:进程的 OOM 调整分数。
4). OOM Killer 决策
oom-kill
:表示 OOM Killer 决策的开始。task=gnome-shell
:被选中的进程是gnome-shell
。pid=2363
:被杀死的进程 ID。uid=1000
:进程的用户 ID(通常是普通用户)。total-vm
:进程的虚拟内存总大小。anon-rss
:匿名内存的常驻大小。file-rss
:文件映射内存的常驻大小。shmem-rss
:共享内存的常驻大小。pgtables
:页面表占用的内存大小。oom_score_adj
:进程的 OOM 调整分数。
5). OOM Reaper 清理被杀死的进程占用的内存
oom_reaper
:是 OOM Killer 的后续进程,负责清理被杀死的进程占用的内存。reaped process
:表示 OOM Reaper 已经成功清理了被杀死的进程。anon-rss:0kB
:匿名内存的常驻大小变为 0。file-rss:4kB
:文件映射内存的常驻大小变为 4kB。shmem-rss:92kB
:共享内存的常驻大小变为 92kB。
7. 发出 SIGKILL 信号 (i)
- 功能描述:向系统中除 init 外的所有进程发出 SIGKILL 信号,强制终止它们。
- 使用场景:系统需要重启或关闭,但某些进程无法通过 SIGTERM 信号终止时。
- 命令示例:
echo i | sudo tee /proc/sysrq-trigger
在虚拟机中卡死,在嵌入式linux的终端内因为看门狗的问题直接重启了。
8. 解冻被 FIFREEZE ioctl 冻结的文件系统(j)
FIFREEZE ioctl 是 Linux 内核中用于冻结文件系统的一种机制, 通过暂停文件系统上的所有写入操作,使文件系统进入冻结状态,从而确保文件系统处于一致的状态,当文件系统被冻结时,内核会等待所有正在进行的文件系统操作完成,并阻止新的写入操作,但读取操作仍然可以进行,支持的文件系统包括 ext3、ext4、ReiserFS、JFS、XFS、Btrfs、F2FS、NILFS2 等
- 功能描述:强制解冻被 FIFREEZE ioctl 冻结的文件系统。
- 使用场景:在进行备份或创建文件系统快照时,使用 FIFREEZE ioctl 冻结文件系统,可以确保备份或快照的数据一致性,避免因文件系统在备份过程中被修改而导致的数据不一致问题。对文件系统进行检查、修复或升级等维护操作时,冻结文件系统可以防止文件系统被访问或修改,从而保证维护操作的准确性和安全性,文件系统被 FIFREEZE ioctl 冻结,需要手动解冻时。
- 命令示例:
echo j | sudo tee /proc/sysrq-trigger
9. 杀死所有当前虚拟控制台中的程序(k)
- 功能描述:Secure Access Key (SAK) 杀死所有当前虚拟控制台中的程序。
- 使用场景:当某个虚拟控制台被恶意程序占用时,可用于清除该控制台上的程序。
- 命令示例:
echo k | sudo tee /proc/sysrq-trigger
虚拟机中卡死,jobs命令(显示当前虚拟控制台中的程序)也没查到对应的后台运行程序。
10. 显示所有活动 CPU 的堆栈回溯(l)
- 功能描述:显示所有活动 CPU 的堆栈回溯。
- 使用场景:用于内核调试,分析系统中各 CPU 的运行状态。
- 命令示例:
echo l | sudo tee /proc/sysrq-trigger
[ 409.631102] sysrq: Show backtrace of all active CPUs#表示显示所有活动 CPU 的回溯信息
[ 409.631105] NMI backtrace for cpu 7#表示对 CPU 7 进行非屏蔽中断(NMI)回溯。NMI 是一种不可屏蔽的中断,用于获取 CPU 的状态信息。
....
[ 409.631108] Call Trace:#分显示了内核调用栈的回溯信息,每行表示一个函数调用的返回地址和偏移量
[ 409.631128] dump_stack+0x6d/0x8b
[ 409.631132] nmi_cpu_backtrace+0x94/0xa0
...#省略
[ 409.631154] RIP: 0033:0x7fe1c004d154#指令指针寄存器,指向当前正在执行的指令。
[ 409.631155] Code: 89 02 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 8d 05 b1 07 2e 00 8b 00 85 c0 75 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 f3 c3 66 90 41 54 55 49 89 d4 53 48 89 f5#显示当前指令附近的机器码
[ 409.631156] RSP: 002b:00007ffcd989dd58#栈指针寄存器
EFLAGS: 00000246#标志寄存器 ORIG_RAX: 0000000000000001
[ 409.631157] RAX: ffffffffffffffda RBX: 0000000000000002 RCX: 00007fe1c004d154#RAX、RBX、RCX、RDX、RSI、RDI、RBP 等:通用寄存器的值
....#省略
[ 409.631160] Sending NMI from CPU 7 to CPUs 0-6:#表示 CPU 7 向其他 CPU 发送 NMI 以获取回溯信息
[ 409.631236] NMI backtrace for cpu 1 skipped: idling at native_safe_halt+0x12/0x20#表示其他 CPU(如 CPU 0、1、2、3、4、6)在空闲状态,回溯信息被跳过。
....#省略
[ 409.631261] NMI backtrace for cpu 5#显示 CPU 5 的回溯信息,包括进程、寄存器状态等
[ 409.631262] CPU: 5 PID: 2161 Comm: gnome-terminal- Not tainted 5.4.0-84-generic #94~18.04.1-Ubuntu
......#省略
11. 显示当前内存信息 (m)
- 功能描述:将当前内存信息 dump 到终端。
- 使用场景:需要查看当前内存使用情况,用于故障排查或性能分析时。
- 命令示例:
echo m | sudo tee /proc/sysrq-trigger
1)内存统计信息
active_anon
:活动的匿名内存页(如进程的堆栈和数据)。inactive_anon
:不活动的匿名内存页。active_file
:活动的文件映射内存页。inactive_file
:不活动的文件映射内存页。unevictable
:不能被回收的内存页。dirty
:脏数据页(尚未写入磁盘的缓存数据)。writeback
:正在写入磁盘的缓存数据。slab_reclaimable
:可回收的内存页。slab_unreclaimable
:不可回收的内存页。mapped
:已映射的内存页。shmem
:共享内存页。pagetables
:页面表占用的内存。free
:空闲内存页。free_pcp
:每个 CPU 的私有空闲内存页。free_cma
:专用内存区域的空闲内存页。
2)内存节点信息
Node 0
:表示第一个内存节点(NUMA 架构中的内存区域)。active_anon
:活动的匿名内存大小(以 KB 为单位)。inactive_anon
:不活动的匿名内存大小。active_file
:活动的文件映射内存大小。inactive_file
:不活动的文件映射内存大小。unevictable
:不能被回收的内存大小。isolated(anon)
:隔离的匿名内存大小。isolated(file)
:隔离的文件映射内存大小。mapped
:已映射的内存大小。dirty
:脏数据大小。writeback
:正在写入磁盘的缓存数据大小。shmem
:共享内存大小。shmem_thp
:共享内存透明大页大小。shmem_pmdmapped
:共享内存 PMD 映射大小。anon_thp
:匿名透明大页大小。writeback_tmp
:临时写入缓冲区大小。unstable
:不稳定内存大小。all_unreclaimable? no
:表示所有内存是否不可回收,no
表示有可回收的内存。
3)每个内存区域的详细信息
DMA
:直接内存访问区域。DMA32
:32 位直接内存访问区域。Normal
:普通内存区域。free
:空闲内存大小。min
、low
、high
:内存压力的阈值。active_anon
、inactive_anon
、active_file
、inactive_file
:各个区域的活动和不活动内存大小。unevictable
:不能被回收的内存大小。writepending
:等待写入的内存大小。present
:存在的内存大小。managed
:被管理的内存大小。mlocked
:被锁定的内存大小。kernel_stack
:内核栈使用的内存大小。pagetables
:页面表使用的内存大小。bounce
:用于数据传输的缓冲区大小。free_pcp
:每个 CPU 的私有空闲内存大小。local_pcp
:本地 CPU 的私有空闲内存大小。free_cma
:专用内存区域的空闲内存大小。
4)内存分配
UM
、M
、U
、E
等标记表示内存块的状态:
U
:表示该内存块被使用。M
:表示该内存块被分配但未使用。E
:表示该内存块被分配并被使用。
5)大页信息
hugepages_total
:总的大页数。hugepages_free
:空闲的大页数。hugepages_surp
:超出部分的大页数。hugepages_size
:大页的大小(这里是 1 GB 和 2 MB)。
6)页缓存和交换分区
total pagecache pages
:总页缓存页数。pages in swap cache
:交换缓存中的页数。Swap cache stats
:交换缓存的统计信息。Free swap
:空闲交换分区大小。Total swap
:总交换分区大小。
7)内存总结
pages RAM
:总物理内存页数。pages HighMem/MovableOnly
:高内存或可移动内存页数。pages reserved
:保留的内存页数。pages cma reserved
:专用内存区域保留的内存页数。pages hwpoisoned
:被硬件标记为损坏的内存页数。
12. 使实时任务可以设置 nice 值(n)
linux中调整进程优先级参数(nice值)的介绍和使用说明可以参考这篇文章
- 功能描述:用来使实时任务可以设置 nice 值。
- 使用场景:用于实时任务的调度管理,调整实时任务的优先级。
- 命令示例:
echo n | sudo tee /proc/sysrq-trigger
具体没搞清楚怎么使实时任务不可以设置 nice 值。希望有清楚的码友可以答疑(^U^)ノ~YO
13. 关闭系统(o)
- 功能描述:关闭系统。
- 使用场景:系统需要紧急关闭时。
- 命令示例:
echo o | sudo tee /proc/sysrq-trigger
直接关机,感觉有点像硬件直接断电的感觉。
14. 显示寄存器 §
- 功能描述:将寄存器和标志信息 dump 到终端。
- 使用场景:用于内核调试,查看当前 CPU 寄存器和标志的状态。
- 命令示例:
echo p | sudo tee /proc/sysrq-trigger
由上图所示,每次输出的可能不一致,应该是在哪个核就输出哪个cpu的信息,具体信息如下:
CPU#7
:表示这是 CPU 7 的寄存器信息。active
:表示当前 CPU 的活动状态寄存器值。gen-PMC0
到gen-PMC3
:表示通用性能监视计数器(Performance Monitoring Counters,PMCs)的信息。ctrl
:控制寄存器的值。count
:计数寄存器的值。left
:剩余计数寄存器的值。
15. 显示所有定时器 (q)
- 功能描述:显示所有定时器。
- 使用场景:用于分析系统中定时器的运行情况,帮助调试和优化定时器相关的代码。
- 命令示例:
echo q | sudo tee /proc/sysrq-trigger
16. 同步所有已挂载的文件系统(s)
- 功能描述:将尝试同步所有已挂载的文件系统。
- 使用场景:在系统重启或关闭前,确保所有数据都已写入磁盘。
- 命令示例:
echo s | sudo tee /proc/sysrq-trigger
17.显示当前任务的列表 (t)
- 功能描述:显示当前任务的列表和它们的信息。
- 使用场景:用于查看系统中当前的进程状态,帮助调试和分析系统性能问题。
- 命令示例:
echo t | sudo tee /proc/sysrq-trigger
这个信息输出的东西很多,没有过多的研究过,最常用的就是下面这个信息:
任务的状态说明:
- S:通常表示任务处于“可中断睡眠”状态(TASK_INTERRUPTIBLE)。
- R:运行状态(TASK_RUNNING),任务正在 CPU 上执行。
- D:不可中断睡眠(TASK_UNINTERRUPTIBLE)。
- Z:僵尸状态(TASK_ZOMBIE),任务已终止但尚未被父进程回收。
- T:跟踪状态(TASK_TRACED),任务被调试器暂停。
- X:死亡状态(TASK_DEAD),任务已终止。
- W:等待退出(TASK_WAKING),任务正在被唤醒。
18. unmount (u)
- 功能描述:强制卸载文件系统。
- 使用场景:文件系统处于不正常状态时,用于强制卸载。
- 命令示例:
echo u | sudo tee /proc/sysrq-trigger
19. show-blocked-tasks (w)
- 功能描述:显示被阻塞的任务。
- 使用场景:用于分析系统中被阻塞的进程,帮助排查死锁等问题。
- 命令示例:
echo w | sudo tee /proc/sysrq-trigger
20. dump-ftrace-buffer (z)
- 功能描述:转储 ftrace 缓冲区的内容。
- 使用场景:用于分析内核的动态跟踪信息,帮助调试内核性能问题。
- 命令示例:
echo z | sudo tee /proc/sysrq-trigger
注意事项
- 风险性:SysRq 命令具有非常高的权限,误用可能导致数据丢失或系统崩溃,使用时需谨慎,特别是在生产环境中。
- 权限:执行这些命令需要 root 权限。