我如何恢复给定 pid 的窗口?当某个程序的窗口消失时(我有时会遇到这种情况),这会很有用。
例如,每次我要关闭 hexchat 时,它都会显示一个确认对话框。如果我单击“取消”,窗口无论如何都会消失,但进程会在后台继续运行。(我可以用 pgrep 查找它的 id)。
如果我知道 pid,是否可以恢复窗口?
答案1
不幸的是,不行——如果 X Windows 应用程序失去连接并且其窗口被破坏,通常没有办法让它重新连接到窗口系统。而且窗口通常只有在程序本身有错误时才会消失——在这种情况下,进程可能在不知情的情况下处于挂起状态,等待永远不会发生的 I/O,因为它没有意识到它的窗口已经消失了。
除非应用程序的设计非常罕见,允许您向其发送特殊信号或消息以重新连接到 X 服务器或重建新窗口,或者除非它仍然作为图标或停靠图标存在于屏幕上的某个地方并且您可以通过这种方式与它交互,否则必须简单地终止程序的进程,然后您必须重新启动它。
不退出进程就关闭最后一个窗口的行为通常是一个错误,您可以向上游报告有关该应用程序的错误。
(注意:也有罕见的例外,比如 Web 浏览器即使关闭了最后一个窗口,也会保持正在运行的进程 - 但在这些情况下,重新单击浏览器的图标或从命令行重新运行它只会告诉已经运行的进程打开一个新窗口。同样,如果要实现这一点,必须专门编写一个应用程序来处理暂时的无窗口情况。)
答案2
正如 Brandon Rhodes 所解释的那样,如果窗口被其父进程破坏/隐藏,则无法从进程或应用程序外部恢复/重新创建/显示它。
您可以从窗口管理器确认,尝试:wmctrl -l -p
,没有列出与其 PID 相关的窗口。
因此,有可能hexchat
仍然有响应,请尝试:
hexchat -e --command="gui show"
-e
在现有的 HexChat 中打开 URL 或执行命令
参考:
man hexchat
- HexChat 2.9.6.1 文档:控制 GUI
man wmctrl
答案3
答案4
您可以尝试 Ctrl + Alt + Del,然后结束该过程。希望这能有所帮助。当 Ubuntu 中的程序冻结或出现异常时,我就会这样做。