冻结的 Linux 系统? 这里有3种方法来处理它

众所周知,Linux 非常稳定,但即使是最稳定的系统也会遇到导致其无响应的情况。 然后,当您按下并按住“Power”时,会出现可怕的感觉。 在这种情况下,可以尝试一些 Linux 技巧。 在这一点上,我们不打算保存任何未保存的工作。 我们希望找到一种方法来避免重新启动,或者至少提供尽可能干净的重新启动以避免损坏。

就本文而言,Linux 可以被视为一组 2 个堆栈:内核堆栈和用户堆栈。 在用户堆栈的某个地方,您有程序正在运行。 很可能是 X 服务器、窗口管理器和一些程序。 您可以将程序列表(包括 X 服务器)想象为用户堆栈中的另一个堆栈。 这个概念将帮助新的 Linux 用户理解我们稍后将执行的一些任务。

1. 用 xkill 杀死一个无响应的程序

如果您使用的是 Linux 桌面,第一步应该是尝试使用窗口管理器的执行命令(在 Ubuntu 中为 alt+f2)功能。 如果你幸运的话,它迟早会弹出。

然后您可以执行 xkill 并将光标指向已失效的窗口并单击它。

Xkill 比传统的 X 图标运行速度更快或右键单击任务栏上的窗口并单击 close. Xkill 立即杀死,不问任何问题。

2. 使用虚拟控制台 (TTY) 恢复冻结的 Linux 系统

有时,你不会那么幸运,系统可能看起来完全死了。

这可能只是一种错觉。 还记得用户栈中的程序栈吗? 让我们稍微处理一下这张图片。

虽然看起来用户堆栈的根是 X,但事实并非如此。

X 视窗系统 运行在 虚拟控制台 (风险投资),也称为 TTY。 它们在文件系统上表示为 /dev/ttyX。 Linux 有多个 VC 可供您使用。 尝试访问另一个可以让您重新控制。

您可以通过按请求不同的 VC CTRL+ALT+F{1,6} 从 GUI 环境或 ALT+F{1,6} 来自另一个VC。 上面的按键使您可以访问 VC 1 到 6。图形界面在 VC 7+ 上运行。

在处理不稳定的系统时,即使请求更改 VC 也可能需要一点时间,所以请耐心等待。

如果您尝试更改虚拟控制台成功,系统将提示您输入用户名和密码。 然后,您将拥有一个文本模式控制台。 你的系统应该在这里恢复一些稳定性,这部分是因为运行 X 和其他所有东西的虚拟控制台不再是优先事项。

登录后,您有几个选项。

  • 您可以尝试使用 kill 或 killall 命令杀死已失效的程序。
  • 你可以杀死窗口管理器、X 服务器或登录管理器。 这将杀死所有子进程,如果一切顺利,您的登录管理器将重新开始向您显示图形登录屏幕。

3. 当一切都失败时,使用 SysReq 与内核对话

有时,即使切换到 TTY 也不起作用。 整个系统都死了。 不要放弃,再一次,这很可能是一种错觉。 对于这种情况,Linux 还拥有一项功能。

如果在内核中编译并在文件中启用,Linux 为您提供了将预设请求直接发送到内核的方法。 这在整个用户堆栈都死了的情况下很有用。 它被称为 Magic SysRq 键. 在大多数发行版中默认编译和启用,只有内核恐慌应该能够阻止它工作。

要确认在编译内核时设置了该选项,您可以尝试在 /boot 中找到当前内核的配置文件。 寻找选项 CONFIG_MAGIC_SYSRQ。 如前所述,它在大多数发行版中都已编译和启用。 要确认它已启用,请运行以下命令:

sysctl kernel.sysrq

在旧系统上,您有 2 个选项:0 和 1。它是 OFF 或 ON。 在较新的版本上,可以更好地控制启用哪些命令。

任何高于 1 的值都表示启用了某些命令。 可以找到更多细节 这里.

要临时设置不同的值,请运行以下命令:

sudo sysctl -w kernel.sysrq=value

要永久更改此值,请编辑 /etc/sysctl.conf. 搜索 kernel.sysrq,并设置所需的值。

查看它是否有效的最简单方法是尝试。 我还建议在系统稳定时测试和学习一组击键。 当您执行 SysRq 调用时,内核将尝试响应。 只有在虚拟控制台 1 到 6 中才能看到此响应。如果焦点无法从 X 移开,您将看不到响应。 这并不意味着它不起作用。

可以发送许多命令。 完整名单可见 这里. 我建议记住以下内容:

钥匙描述
Alt + SysRq + r使键盘脱离原始模式,从 X 中夺走控制权
Alt + SysRq + e向所有进程发送 SigTerm,让他们有机会优雅地退出
Alt + SysRq + i向所有进程发送 SigKill
Alt + SysRq + k杀死当前虚拟控制台中的所有进程
Alt + SysRq + s同步所有挂载的文件系统,将所有数据刷新到磁盘
Alt + SysRq + u以只读方式重新挂载所有文件系统
Alt + SysRq + b立即重新启动系统,不同步或卸载
Alt + SysRq + o停机系统

在处理不稳定的系统时,这个简短的命令列表为您提供了一个强大的新工具。 发送请求时,如果您看不到内核的响应,请在命令之间留出几秒钟的时间。 请求硬盘操作时,请注意硬盘指示灯。

有 2 个序列值得记住。

Alt + SysRq + r e k

这个序列对于重新启动无响应的 X 服务器很有用。 您首先使用以下命令使键盘退出原始模式 Alt + SysRq + r. 然后您请求发送一个 SIGTERM 对所有进程 Alt + SysRq + e. X 服务器可能会根据这个请求重新启动。 如果是这样,你已经拯救了你的系统。 如果没有,请继续执行第三个请求, Alt + SysRq + k. 哪个会发送 杀戮 到当前虚拟控制台中的所有进程。

如果您的系统在上述序列之后仍然没有响应,您应该继续执行下一个序列。

Alt + SysRq + r e i s u b

最后一条命令将启动紧急重启。

  • r : 让键盘退出原始模式
  • e : 向所有进程发送 SIGTERM
  • 一世 : 向所有进程发送 SIGKILL
  • s : 同步所有挂载的文件系统
  • : 紧急重装只读
  • b : 立即重启系统

你现在配备了我所知道的对抗无响应系统的最佳工具。 您可以关注此视频 我的 YouTube 渠道 进行演示。

我希望你通过这篇文章学到了一些关于处理冻结的 Linux 系统的新知识。 我想知道您对此的反馈。 请使用评论部分并分享您的想法。