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