当应用程序 (thunderbird) 出现问题时,有时它会进入无响应状态,其中会阻止 UI、阻止登录进程(在 tty 终端)并且还会阻止使用 Ctrl-Alt-Backspace 重新启动 X 会话。
通常在 *nix 盒子上,向进程发送信号足以让我返回足够的访问权限以重新获得控制权,但在这种情况下,一切都被破坏了,即使它只是一个使用大量 RAM 和交换的应用程序。
使用 Ctrl-Alt-F1 给了我一个控制台和登录提示,我可以输入 root 用户名,但它不会返回密码提示,所以我被卡住了。
Ctrl-Alt-Backspace 导致 X 会话重新启动,但它没有给我登录提示,并且需要重新启动电源。
是否有某种方法可以将击键绑定到某种低级“中断功能”(我的意思是一般意义上的)以暂停令人烦恼的挂起进程,以便我可以看到它正在尝试做什么strace
?
我隐约意识到某些阻塞进程在返回之前无法挂起,但在这种情况下,没有迹象表明阻塞进程被阻止访问任何 IO 资源,它只是看起来在做一些愚蠢的事情。
我原本想用一些 bash 脚本来 ionice 和 renice 与 Thunderbird 关联的任何进程到最低优先级,但我想如果事情像看起来那么糟糕,那么新进程将无法获得 CPU。
我想为此使用 Ctrl-Break 键,因为在我的计算机上的桌面会话期间它不用于其他任何操作。
基本上,桌面(缓慢)响应按键和鼠标,因此有一定范围运行命令以导致不良进程挂起,我只是不知道在这种情况下可以使用哪种命令。
答案1
我的猜测是 Thunderbird 消耗了大量内存。如果你能得到一个 shell/控制台,而不只是杀死进程。通常,如果您正在重建搜索索引或在缓存中加载数千封电子邮件,thunderbird 将挂起。
你还可以在 linux oom Killer 中设置优先级,/proc
以便首先处理 SIGTERM。
我们先找到thunderbird的进程。 (使用您喜欢的任何内容:pgrep
、ps -ef|grep …
等)
bash$ pidof thunderbird
1439
现在要暂时停止该过程,您只需停止该过程即可:)
bash$ kill -s SIGSTOP 1439
bash$ strace ...
一旦您满意,您就可以继续该过程,并发出“继续”信号。 :)
bash$ kill -s SIGCONT 1439
另外,如果它是一个线程,您可以考虑使用,tkill
或者tgkill
但您可能必须先安装它。
答案2
我不知道它是否会回答您问题的所有细节,但它会给您一些提示。
当我尝试知道某些程序行为不当的根本原因是什么时,就是从控制台运行它(我的意思是你运行GUI程序,但你从控制台启动它),这样你就可以知道它在做什么,因此您可以获得有关如何解决雷鸟问题的线索。
更具体地说,当我遇到像你提到的情况时,我在做什么,我通过 ssh 进入机器(是的,我可以登录,尽管我什至无法使用 Alt+F4 获取 tty1),然后使用 ,top
或ps ax | grep thunderbird
杀死程序后,桌面(包括 X 和所有其他打开的窗口)又恢复正常。
我知道它并不完全触及您在问题中绘制的正确位置,但我给出了我所拥有的。