max*_*zig 6 window-manager xterm
我通常将长时间运行的 X 会话与多个虚拟桌面和许多 xterm 一起使用。
我还在 shell (zsh) 中使用作业控制。
有时我希望我能用一个简单的命令识别一个 shell 或进程正在运行(甚至挂起)的 xterm。
例如,您使用 vim 编辑一个文件,vim 会警告您该文件已被另一个仍在运行的 vim 实例打开。但是现在您已经忘记了这个带有进程 ID XYZ 的 vim 是在哪个 xterm 中启动和暂停的。杀死它不起作用,因为它被暂停。通过信号恢复它然后终止可以工作,但它可能会搞砸一个在前台运行的进程,也许你不想终止 vim 实例,因为它设置了几个窗口......
目前我正在使用 awesomewm,但我也对其他 wms 的解决方案感兴趣。
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"。
您可以使用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)