如何识别 shell 或进程正在哪个 xterm 中运行?

如何识别 shell 或进程正在哪个 xterm 中运行?

我通常将长时间运行的 X 会话与多个虚拟桌面和许多 xterm 一起使用。

我还在 shell (zsh) 中使用作业控制。

有时我希望能够通过一个简单的命令来识别 shell 或进程正在运行(甚至挂起)的 xterm。

例如,您使用 vim 编辑一个文件,vim 警告您该文件已被另一个仍在运行的 vim 实例打开。但现在你已经忘记了这个进程ID为XYZ的vim是在哪个xterm中启动和暂停的。杀死它不起作用,因为它被暂停了。通过信号恢复它然后杀死它可以工作,但它可能会搞砸前台运行的进程,也许你不想杀死 vim 实例,因为它设置了多个窗口......

目前我正在使用awesomewm,但我也对其他wms的解决方案感兴趣。

答案1

Xterm 将变量WINDOWID放入其子进程的环境中。它的值是 xterm 窗口的窗口 ID。没有 POSIX 方法可以根据进程的 PID 查询其环境;这是查询进程环境$pid并提取WINDOWID变量的 Linux 方法:

</proc/$pid/environ gawk -v 'RS=\0' -F = '$1=="WINDOWID" {print $2}'

wmctrl然后,您可以使用窗口管理器界面查找窗口或对其进行操作。

如果您使用 screen,请首先尝试该STY变量,该变量设置为 screen 会话的名称。您可以使用 来连接到该会话screen -rd -S "$sessionname"

答案2

您可以使用它ps -o ppid= PID来获取进程 PID 的父 ID,这可能是启动它的 shell。该 shell 的父 ID 将是包含它的终端。


为了进行测试,我生成了一个会保留一段时间的进程:

$ sleep 5m &
[1] 31177

然后我查找了进程31177的父进程,它是什么命令:

$ ps -o ppid= 31177
31107
$ ps -o cmd= 31107
zsh

31107 是我运行的 zsh 进程sleep 5m。我在该zsh进程上重复了这一点

$ ps -o ppid= 31107
31097
$ ps -o cmd= 31097
xterm

31097 是xterm我的zshshell 运行的地方


如果您不确定所需的父级有多远,您可以使用它来搜索具有给定命令名称的父级:

pid="$1"
cmd="$2"

seek=""
while [ "$seek" != "$cmd" ]; do
    # ps -o ppid= $pid
    pid=`ps -o ppid= $pid`
    seek=`ps -o cmd= $pid`

    if [ ${pid/ /} = 1 ]; then
        echo Reached the top of the tree
        exit 1
    fi
done

echo $pid

测试:

$ /tmp/find-parent 31177 xterm
31097

相关内容