我通常将长时间运行的 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
我的zsh
shell 运行的地方
如果您不确定所需的父级有多远,您可以使用它来搜索具有给定命令名称的父级:
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