当GNOME Shell冻结或无响应时,您如何重新启动它呢?

有时候,我的GNOME Shell会冻结。我可以看到(听到)后台进程在工作(播放音乐),但是我无法在GNOME中做任何事情。没有Alt+F2然后REnter
我可以使用Ctrl+Alt+F1切换到控制台,以相同的用户登录并执行:
gnome-shell --replace

按下Ctrl+F7返回,但是接着出现了奇怪的行为。例如,我无法编辑网络连接,也无法注销。重新启动gnome-shell的正确方法是什么?

使用gnome-shell概览中的搜索功能时,是否会导致gnome-shell冻结?或者在什么特定情况下会发生冻结,如果你能告诉我的话? - v2r
2不,它在登录后会冻结(大多数情况下),通常是在解除连接后。 - jk_
2到目前为止,我还没有找到一个可行的解决方案。最后,我采用了这个变通方法 - jk_
如果您使用了来自https://extensions.gnome.org/的任何shell扩展,请将它们全部停用并重新启动,以查看是否其中一个引起了问题。我使用的是较旧版本的gnome-shell,并且由于这个确切原因遇到了很多问题!(也许事情就是这么简单?!) - v2r
1我尝试了将它们全部停用,但问题仍然存在 :( - jk_
那我不知道!抱歉!! - v2r
我更喜欢:gnome-shell -r & 在相同的显示器上从gnome终端中运行效果很好。 - wieczorek1990
我终于定义了一个别名,它应该在任何终端中都能工作,无论是tty还是其他:alias gnomeshellrestart='echo "gnome-shell --replace -d" $(w| grep "$USER"| awk "{print \$3}"|grep ":"|head -1)| at now' - MoreIT
我在Linux和Gnome上至少有10年的时间遇到了这个问题,而且是在几台不同的电脑上。无论是Debian还是Ubuntu都会出现这个问题。每个月你登录后,除了鼠标指针之外,一切都会冻结,你无法做任何事情,而且在任何日志文件中也找不到有用的信息:/ - BjornW
11个回答

更简单的方法是只需按下Alt + F2,然后输入r再按下Enter。只要shell可用,这个方法就有效。
你也可以发送SIGQUIT信号给gnome-shell进程,这将仅终止shell:
killall -3 gnome-shell

其他方法使用更具破坏性的手段,会关闭所有应用程序,这是不应该的。

6+1 对于“SIGHUP”提示,不过,正确的命令应该是killall -1 gnome-shell吧?至少根据man 7 signal中的说明,SIGHUP的值为1。值为3对应的是SIGQUIT。我已经向Gnome Shell发送了值为1的信号,并且它按预期地重新启动了。 - Chriki
@Chriki是的,它是Sigquit,尽管大多数信号会使gnome-shell进程结束。 - Braiam
3我在 Fedora 25 上尝试过这个方法,执行 killall -3 gnome-shell 后,导致所有应用程序都被关闭了。 - comfreak
8我希望我们也能使用一个与Alt+F2r完全相同效果的终端命令,即不会使整个屏幕变空白... - Sadi
这个禁用了我所有的gnome-shell-extensions。即使重启后,它们也没有恢复,直到我逐个重新激活它们。 - fsevenm
@fsevenm 这些都没有涉及到 shell 配置。也许 GNOME 会变得聪明,说:“嗯,我被不干净地终止了,也许我应该责怪其中的一个扩展,嗯。” - Braiam
你是上帝!非常非常感谢你!! - 井上智文
使用Ubuntu 20时,这个方法帮助我保存了我的会话。我建议使用CTRL+ALT+F3或进入任何TTY会话控制台执行"killall -3 gnome-shell"命令。这不会关闭我打开的其他应用程序。 - Lelouch Lamprouge

  • 如果你想“友好地”要求gnome-shell重新启动自己,你可以通过以下命令调用它的内部重启函数(假设你已经将DBUS_SESSION_BUS_ADDRESS环境变量设置为正确的值,并且以相同的用户身份运行):

    dbus-send --type=method_call --print-reply --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'global.reexec_self()'
    
  • 如果你想运行一个新的实例,gnome-shell --replace应该可以。在控制台上,你需要定义必要的环境变量,如DISPLAYDBUS*等。参考/proc/$gnome_shell_pid/environ

  • 如果你想重新启动现有的实例,那么killall -HUP gnome-shell可以做到。不过,如果你经常这样做,gnome-shell可能会禁用所有扩展,强制注销你,或以其他非用户友好的方式行事。

我创建了一个shell函数,它从gnome-shell进程环境中设置DBUS_SESSION_BUS_ADDRESS(这样你就可以logout otheruser1 otheruser2)。http://askubuntu.com/a/874504/17941 - sehe
4在没有使用sudo的情况下,出现了错误Error org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.Shell was not provided by any .service files,而在使用sudo时,出现了Failed to open connection to "session" message bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 - Seanny123
如果没有gnome-shell在运行(即它已经停止工作),那该怎么获取DISPLAY和其他变量呢? - Dan M.
非常感谢您! - seanbreeden
这对于编写Shell扩展非常有用。 - 0x777C

如果你已经安装了Ubuntu GNOME(应该是这样的),那么你可能正在使用GNOME显示管理器。在这种情况下,你应该切换到另一个TTY,比如Ctrl + Alt + F4,然后...
sudo service gdm restart

我最近也写了一篇关于这种情况的文章:

帮助,我的Linux桌面卡住了!

祝好运!


10小心点,我在同一个TTY上操作时,不小心结束了当前的会话。 - alexandre-rousseau
这完全搞砸了当前的会话:它开始闪烁,然后进入涅槃..不得不重新启动。 - Nik O'Lai
2是的,这个回答真糟糕。 - chx101
这取决于您使用的Ubuntu版本。在这里,它是16.04。 - Gerhard Stein
我同意,小心点!这个命令可能会导致你丢失设置。对我来说,就是丢失鼠标设置,禁用GNOME Shell扩展(扩展包括:Dash to Panel、Clock Override、Datetime Format)。 - mkczyk

这里有一个不同的解决方法:
  1. 按下 CTRL+ALT+F1 键,在本地终端登录。
  2. 运行以下命令:

    sudo kill -HUP $(pidof gnome-shell)
    
  3. 按下 CTRL+ALT+F7 键返回图形界面。
PS:我使用的是lightdm而不是gdm3。

1简单而且非常有效!(至少对我来说) - Katai
2虽然这样确实可以成功重新启动gnome-shell,但我发现一些程序 - 可能是那些与GNOME集成程度较低的程序 - 无法幸存下来;例如:Firefox、Thunderbird、VirtualBox虚拟机。幸存下来的程序示例包括:“文件”、“终端”、“图像查看器”。理想情况下,希望有一种方法可以在不危及任何正在运行的程序的情况下重新启动gnome-shell(Ubuntu 19.10)。 - sxc731

由于您对gnome-shell --replace不满意,您可能想尝试重新启动显示管理器本身。

sudo service lightdm restart

我认为这样做会终止你正在运行的其他进程。 还可以参考http://worldofgnome.org/how-to-restart-gnome-shell-when-freezes-if-ever/
如果你遇到严重的冻结问题,可以按照https://www.kernel.org/doc/Documentation/admin-guide/sysrq.rst中提到的方法启用SysRq,并使用<alt><sysrq/print_screen_key><k>来终止屏幕上的任何内容。

3重新启动lighdm可以解决问题,但我想避免这样做,因为我必须从头开始重新打开所有东西。特别是如果我知道这是Gnome-shell的问题,并且重新启动它几乎可以解决问题。 - jk_
我不知道其他重新启动gnome shell的方法。你试过DISPLAY=:7 gnome-shell --replace是否有效吗? - Jay Aurabind
1不,它不会,我使用显示器,当 w 显示的显示器与 :0 不同时,显示器会显示不同。如果我使用错误的显示器,就会出现错误。 - jk_
抱歉,我已经没有其他选择了。你应该去gnome用户/开发者邮件列表上询问。首先弄清楚为什么在使用alt-f2-rgnome-shell --replace时会出现异常情况,因为这是gnome推荐的方法。 - Jay Aurabind
我也是。我甚至按照这个链接设置了更多的环境变量,但是当我从不同的终端重新启动gnome-shell时,我仍然无法编辑网络连接。最后,我使用了这个技巧 - jk_
最后以这个技巧结束:我可以认同它完美地解决了你的问题吗? - Jay Aurabind
实际上不是这样的。它有时可以正确地重新启动gnome-shell,但今天没有起到帮助作用。在拔下连接后,我的gnome-shell卡住了,重启解冻了shell,但我无法打开WiFi :( 我目前唯一的选择是service gdm restart - jk_

我有时会遇到你描述的同样问题,我的解决方法是:

Ctrl + Alt + F1,以相同用户登录并执行:

sudo pkill -9 ^gnome-shell

然后按下 Ctrl + Alt + F7 返回。

如果这是正确的方法,我不知道。对我来说,每次都有效。


4这将终止所有用户的gnome-shell实例,这可能不是在多用户场景下您想要做的事情。通常情况下,您只需要终止自己的实例(pkill -HUP gnome-shell)。 - Steeve McCauley
太好了,这对我很有效!你救了我的一天。非常感谢。 - NomanJaved

重新启动 X

首先,使用以下命令找出你的Ubuntu使用哪个显示管理器:
``` cat /etc/X11/default-display-manager ```
在我的情况下,显示管理器是 `/usr/sbin/gdm3`。
针对方法1至4,通过使用 `w` 命令找出你正在使用的显示器。
``` w ```
答案可能是例如 `tty3`,因此我的(ack的)“返回到我的显示器”键是 Ctrl+Alt+F3。

方法

  1. 按下Ctrl+Alt+F1退出,按下Ctrl+Alt+F3返回
  2. sudo /etc/init.d/gdm3 restart
  3. systemctl restart gdm.service
  4. sudo service gdm3 restart
  5. dbus-send --type=method_call --print-reply --dest=org.gnome.Shell /org/gnome/Shell org.gnome.Shell.Eval string:'global.reexec_self()'
  6. 一种简单的方法是按下Alt + F2,然后输入r,然后按Enter键。只要shell不无法使用,这个方法就有效。

第五种方法直接从korc的答案中抄袭,第六种方法则来自Braiam的答案。在这里抄袭并不违反规定,但确实不够酷。你只需要通过加引号来表明这份工作并非你的原创,并通过包含源帖子链接和作者个人资料页链接来给予归属。更多细节请参阅此博文:要求署名 - wjandrea

如果您在受影响的计算机上启用了SSH,针对Ubuntu 20.04操作系统,请按照以下步骤进行操作:
  1. 从远程计算机通过SSH登录到受影响的计算机。
  2. 执行killall -1 gnome-shell命令,不需要使用sudo。
在登录时可能会有一点延迟,因为系统正在重新实例化所有的gnome对象,请耐心等待;但是大多数(如果不是全部)正在运行的程序应该会继续工作。

(目前)点赞最多的回答由@Braiam提供缺少一些细节。其他一些回答对我来说不起作用。因此,我写下了对我有效的方法。请注意,这是在运行GNOME Shell 3.36.9的Ubuntu 20.04上进行测试的。
如果当前的GNOME Shell实例仍然响应,请使用Alt + F2rEnter重新启动它。这在大多数情况下都有效。但偶尔,Shell可能会完全无响应,甚至此命令也可能被卡住。在这种情况下,请继续以下步骤。
进入TTY界面。在我的系统上,组合键是Ctrl + Alt + F3F6
登录。(请注意,在TTY中,数字键盘上的数字键可能无法正常工作!)
使用pidof gnome-shell找到GNOME Shell的PID。
使用sudo kill -1 <pid>杀死它,将<pid>替换为上一步骤的输出。(如果不使用sudo,将会出现“操作不允许”的错误。)
重新执行第3步。如果没有返回任何内容,则表示GNOME Shell尚未重新启动。请重复第3步,直到获得新Shell实例的PID。(请注意,此PID与第3步中获得的PID不同。)
一旦返回新Shell实例的PID,您可以安全地返回图形界面。输入exit并退出TTY。
返回图形界面。在Ubuntu 20.04中,可以使用Ctrl + Alt + F2实现。
这种方法没有关闭任何正在运行的应用程序。这些应用程序中的未保存更改仍然存在,没有任何问题。所有的GNOME扩展也都正常加载了。

重新执行第3步。如果没有返回任何内容,则表示GNOME Shell尚未重新启动。无论我等待多长时间,GNOME Shell都不会重新启动。Ubuntu 22.04,GNOME Shell 42.5,Wayland。 - JonBrave
1在Wayland上,Gnome无法重新启动。您必须使用Xorg或重新启动计算机。 - Wrichik Basu

  1. 按下Ctrl+Alt+F2切换到终端窗口。有时候,这是不可能的。

  2. 按下Alt+SysRq+R获取键盘。

  3. 如果之前按下Ctrl+Alt+F2没有成功,请现在再试一次。

  4. 按下Alt+SysRq+E终止所有进程。

  5. 按下Alt+SysRq+I杀死所有进程。

  6. 按下Alt+SysRq+S同步您的磁盘。

  7. 等待OK或Done消息。如果您看不到消息,请观察您的硬盘灯是否显示同步是否产生了影响。

  8. 按下Alt+SysRq+U卸载所有磁盘驱动器。

  9. 等待OK或Done消息。如果您在15-30秒内看不到消息,请假设磁盘已经卸载(或者无法卸载)并继续进行。

  10. 按下Alt+SysRq+B重新启动。