Contents

在Linux上处理冻结的Windows和桌面

1. 概述

冻结的桌面真的很让人生气,尤其是当我们第一次开始在桌面上使用 Linux 时。许多初学者会尝试硬重启整个机器,这可能会导致数据丢失。

在本教程中,我们将尝试不同的解决方案和变通方法来安全地解决此问题。其中一些解决方案是特定于X11 的,但其他一些解决方案也适用于Wayland

2. 解决方案

我们将首先要求内核很好地终止导致问题的进程。例如,桌面会话可能工作正常,但其中一个窗口可能没有响应交互。

之后,对于暂停的桌面会话,我们将尝试终止会话并重新启动它。最后,如果所有这些方法都失败了,我们将拔出大炮强行杀死导致问题的进程或重新启动整个机器。

2.1. 终止进程

对于非常慢或没有响应的进程,我们可以简单地打开我们的终端来杀死这些特定的进程。当然,我们也可以使用像GNOME System Monitor 这样的任务管理器来达到同样的目的。

在 Linux 上,我们有很多方法可以终止进程,其中之一就是简单地使用kill命令:

$ kill 2722

kill 命令默认会发送一个 SIGTERM 信号。SIGTERM 信号要求进程保存和清理其数据并自行退出。

但是,这可能并不总是有效,我们可能不得不强制终止该进程。在这种情况下,我们可以发送另一个名为 SIGKILL (-9) 的信号来强制终止进程

$ kill -SIGKILL 2722
$ kill -9 2722

寻找进程的PID然后将其杀死似乎有点繁琐。因此,我们可以使用pkill 等其他kill命令来杀死匹配模式的进程:

$ pkill firefox*

或者我们可以使用killall 杀死某个进程的所有实例:

$ killall firefox

另一种选择是使用pgrep grep 进程的 PID 并杀死它:

$ kill -9 $(pgrep firefox)

请注意,如果进程正在执行一些关键工作,例如读取或写入数据,我们应该避免使用发送 SIGKILL。

在大多数情况下,这些基本命令应该足以让我们处理冻结的窗口。但是,有一种更简单、更快捷的方式来终止图形进程,我们将在下一节中介绍。

2.2. xkill

xkill 命令仅适用于 X Windows 系统 (X11) 。tiny 实用程序强制 X 服务器终止与指定客户端窗口的连接,该客户端窗口可以是任何正在运行的图形进程。

此外, 默认情况下xkill不附带 X11 软件包。但是,它应该可以在我们发行版的官方软件包存储库中以xorg-xkill的名称获得。我们可以使用像aptyum 这样的包管理器来安装它。

一旦我们有了xkill,我们可以简单地使用xkill命令启动它:

$ xkill

运行命令后,我们会注意到光标变为骷髅或十字标志。此时,我们可以单击要终止的任何窗口:

/uploads/frozen_windows_desktop/1.png

一旦我们单击一个窗口,该窗口将关闭,xkill命令将退出。

我们应该知道,当我们有一堆属于父窗口的子窗口时,杀死其中一个窗口将终止所有窗口(包括父窗口)。

**此外,我们可以通过将 SUPER+X 之类的快捷键绑定到xkill命令来加快此过程。**对于不同的发行版,此过程会略有不同,但通常,我们在键盘设置的快捷方式选项卡中绑定键。

2.3. 虚拟终端 (TTY)

当我们无法访问常规交互式终端时,我们可以切换到TTY终端。 **TTY 是一个虚拟终端,我们无需在桌面计算机上使用图形环境即可运行它。**因此,如果我们的图形桌面被冻结,TTY 将在大多数情况下正常运行。

通常,大多数 Linux 发行版为我们提供了多达 9 个虚拟终端。每个虚拟终端都在自己的进程中运行。因此,我们可以轻松地在多个虚拟终端之间切换以进行多任务处理。

在 Ubuntu 和 Fedora 等大多数主要发行版上,我们可以通过按 ALT+CTRL+FN KEY 访问虚拟终端。例如,按 ALT+CTRL+F1 将为我们启动 TTY 1。

一旦我们启动一个 TTY,它会提示我们登录。登录成功后,我们就可以访问一个功能齐全的全屏终端了:

/uploads/frozen_windows_desktop/2.png

此时,我们可以执行 kill 命令或使用 TUI 任务管理器(如tophtop )优雅地终止导致问题的进程。

此外,一旦完成,我们可以使用 ALT+CTRL+F7 切换回桌面会话。第 7 个 TTY 大部分时间是桌面会话所在的位置。但是,我们应该注意我们的桌面会话可能在不同的 TTY 上运行。在这种情况下,我们应该在其他 TTY 之间切换以查找我们的桌面会话。

2.4. 终止桌面会话

有时,我们的桌面会话被冻结,我们别无选择,只能终止并重新加载整个会话。对于某些桌面环境,可能有一个重新加载热键或我们可以使用的命令。

例如,在SwayWM (Wayland) 上,我们有一个重新加载桌面会话的默认绑定。在基于 KDE 的桌面环境中,我们可以按 CTRL+AL>+ESCAPE 来刷新 KDE 会话。

尽管如此,如果桌面环境没有这个选项,我们可以终止会话进程。如果我们正在运行 X11,我们可以简单地从 TTY 中终止会话:

$ pkill x

对于基于 Wayland 的桌面环境,我们可以简单地杀死一个专门管理会话的进程。例如,在 Ubuntu 上,我们可以向gnome-shell发送一个 SIGQUIT 信号:

$ kill -3 gnome-shell

或者如果我们正在运行dbus,我们可以简单地重新启动它:

$ dbus-run-session -- gnome-shell --nested --wayland

终止桌面会话很可能会将我们带到一个虚拟终端或登录管理器屏幕,我们可以在其中重新登录到我们的桌面会话。

2.5. 最后的手段:提高大象

作为我们最后的手段,当我们的机器卡住并且无法响应任何击键时,我们可以在硬重启之前依次尝试其中一些Magic SysRq 快捷方式。无论系统状态如何,这些键序列都由 Linux 内核专门处理。在处理这些键序列时,内核尝试在不破坏文件系统的情况下从冻结状态恢复机器。

这些键序列涉及一个神奇的 SysRq 键,它会因键盘而异。在笔记本电脑上,可以使用 Fn 键调用,而在普通键盘上,可以使用 PrntScr 键调用:

  • ALT+SysRq+R — 将键盘切换到“原始”模式
  • ALT+SysRq+E — 向除init 之外的所有进程发送 SIGTERM
  • ALT+SysRq+I — 发送 SIGKILL 以终止剩余进程
  • ALT+SysRq+S — 同步所有文件系统以防止数据丢失
  • ALT+SysRq+U — 将所有文件系统重新挂载为只读
  • ALT+SysRq+B — 重启系统

如果这种方法仍然不起作用,那么我们应该硬重启我们的盒子,因为别无选择。