如何通过挂起的不可杀死的应用程序从抓取中释放键盘和鼠标?

Rus*_*lan 16 keyboard x11

假设我有一个 X 应用程序,它使用键盘和鼠标作为其正常操作模式(例如 QEMU),但是由于某个地方的错误,它非常难以挂起(例如陷入磁盘睡眠)。通常我会kill(1)从远程终端杀死一个应用程序,但如果应用程序处于磁盘睡眠模式,它就不能真正被杀死。我可以通过xkill实用程序终止此应用程序与 X 服务器的连接,但是这次我不能这样做,因为鼠标被抓住了,因此xkill将无法运行。

那么,如果我愿意牺牲这个客户端,但我无法通过操作系统的方式杀死它,我如何从 X 客户端的抓取中释放我的键盘和鼠标?

Rus*_*lan 16

虽然最广为人知的使用方式xkill是“click to kill”,但有一个选项-id,它可以提供您要与X服务器断开连接的客户端的Window Id。然后,如果您可以从远程终端/VT 访问您的 X 会话,您可以使用xprop或其他一些方法来获取 Id,并将其传递给xkill.

假设当前的活动窗口属于抓取键和鼠标的 X 客户端。然后以下内容将终止此客户端与 X 服务器的连接,从而从抓取中释放键盘和鼠标:

winid=$(xprop -root _NET_ACTIVE_WINDOW | cut -d# -f2)
xkill -id $winid
Run Code Online (Sandbox Code Playgroud)

当 QEMU 陷入磁盘睡眠时,当我试图摆脱 QEMU 的抓取时,这实际上对我有用。

  • 需要注意的一个警告是,不能保证挂起窗口上的“xkill”会终止进程。一个进程很可能被严重卡住,以至于它不会注意到它的窗口已经消失了。有时还是先去掉窗口,然后再处理这个过程。 (3认同)