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

max*_*zig 6 window-manager xterm

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

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

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

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

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

Gil*_*il' 7

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

</proc/$pid/environ gawk -v 'RS=\0' -F = '$1=="WINDOWID" {print $2}'
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用wmctrl或通过您的窗口管理器界面查找或操作该窗口。

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


Mic*_*zek 6

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


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

$ sleep 5m &
[1] 31177
Run Code Online (Sandbox Code Playgroud)

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

$ ps -o ppid= 31177
31107
$ ps -o cmd= 31107
zsh
Run Code Online (Sandbox Code Playgroud)

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

$ ps -o ppid= 31107
31097
$ ps -o cmd= 31097
xterm
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

测试:

$ /tmp/find-parent 31177 xterm
31097
Run Code Online (Sandbox Code Playgroud)