在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的名称获得。我们可以使用像apt或yum 这样的包管理器来安装它。
一旦我们有了xkill,我们可以简单地使用xkill命令启动它:
$ xkill
运行命令后,我们会注意到光标变为骷髅或十字标志。此时,我们可以单击要终止的任何窗口:
一旦我们单击一个窗口,该窗口将关闭,xkill命令将退出。
我们应该知道,当我们有一堆属于父窗口的子窗口时,杀死其中一个窗口将终止所有窗口(包括父窗口)。
**此外,我们可以通过将 SUPER+X 之类的快捷键绑定到xkill命令来加快此过程。**对于不同的发行版,此过程会略有不同,但通常,我们在键盘设置的快捷方式选项卡中绑定键。
2.3. 虚拟终端 (TTY)
当我们无法访问常规交互式终端时,我们可以切换到TTY终端。 **TTY 是一个虚拟终端,我们无需在桌面计算机上使用图形环境即可运行它。**因此,如果我们的图形桌面被冻结,TTY 将在大多数情况下正常运行。
通常,大多数 Linux 发行版为我们提供了多达 9 个虚拟终端。每个虚拟终端都在自己的进程中运行。因此,我们可以轻松地在多个虚拟终端之间切换以进行多任务处理。
在 Ubuntu 和 Fedora 等大多数主要发行版上,我们可以通过按 ALT+CTRL+FN KEY 访问虚拟终端。例如,按 ALT+CTRL+F1 将为我们启动 TTY 1。
一旦我们启动一个 TTY,它会提示我们登录。登录成功后,我们就可以访问一个功能齐全的全屏终端了:
此时,我们可以执行 kill 命令或使用 TUI 任务管理器(如top 或htop )优雅地终止导致问题的进程。
此外,一旦完成,我们可以使用 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 — 重启系统
如果这种方法仍然不起作用,那么我们应该硬重启我们的盒子,因为别无选择。