如何退出当前 X 显示器上的窗口管理器?

如何退出当前 X 显示器上的窗口管理器?

假设我有窗口管理器 Blackbox 在两个不同的 X 显示器上运行,例如:0.0和分别从和:1.0启动。从终端(模拟器)中,如何退出(终止)使用当前 X 显示的 Blackbox 进程?该命令不适合,因为它会终止两个会话。tty1tty2killall blackbox

答案1

ps e列出进程及其命令行以及(初始?)环境变量。过滤与-display :0命令行或环境匹配的进程DISPLAY=:0。我相信这会找到有问题的 wm,无论是手动启动还是通过某些会话脚本启动。那么我们就可以简单的kill进行一下了。


我听说有不同的 ps 实现,上面的(bsd?)命令行样式可以在我的机器上使用 debian procps-ng 运行。必要时请参阅手册。


基于 wm 是所有者的观察根窗口,这个拱形维基页面有一个小节使用 的方法来xprop -root _NET_WM_PID查找 pid , 。但这对我不起作用,似乎是因为 x windows 提供此属性只是自愿的,而我的 wm 恰好不遵循这种时尚。

对于其他不可行的想法,xkill可以分离客户除了根窗口,所以这里不满足我们的需要。

答案2

如果您已识别启动 blackbox 的 tty,ps -t tty1则会列出从该终端启动的进程(假设 tty1 是您启动要杀死的 openbox 的进程),然后您可以识别并杀死您想要的进程。

答案3

这是受 soubunmei 的答案启发的解决方案:

#!/bin/sh

ActiveWindowManagerPID()
{
    local windowManager="$1"

    local windowManagerPIDs="$(pidof "$windowManager")"

    local displayNumber="$(echo $DISPLAY \
        | awk 'BEGIN { FS = "[:.]" } { print $2 }')"

    ps e -p "$windowManagerPIDs" \
        | awk -v n="$displayNumber" \
            '$0 ~ " DISPLAY=:" n "[\n .]" { print $1 }'
}

kill "$(ActiveWindowManagerPID blackbox)"

相关内容