有很多方法可以获取与给定进程关联的 PTS - 例如使用命令tty
或解析/proc/self/fd/0
(假设它是开放的且未重定向) - 但反过来呢?如何获取运行pts的shell的PID?
我可以尝试使用类似的东西ps -t $(tty)
,但这并不能提供足够的信息来可靠地确定根 shell(即多个 shell 实例、长时间运行的系统上的 PID 重用等)。我能想到的唯一方法是手动收集与终端关联的所有进程并访问每个进程的/proc
条目以确定进程层次结构,然后假设它是最顶层的父进程。
tty
我可以使用简单的反向命令吗?不需要太多工作就能给我 PID 的吗?
答案1
如果您的ps
命令支持按开始时间排序,您可以找到最早拥有该 tty 的进程。
$ ps --sort start_time -t pts/138 |head -2
PID TTY TIME CMD
13326 pts/138 00:00:02 bash
如果您ps
不支持这一点,您仍然可以通过按开始时间对所有相关 pid 进行排序(第 22 个字段/proc/<pid>/stat
-“系统启动后进程开始的时间”) 并获取最低的 pid:
$ for p in $(ps -o pid -t pts/138 |tail -n +2); do awk -v PID=$p '{print $22,PID}' /proc/$p/stat 2>/dev/null; done | sort -g | head -1 | awk '{print $2}'
13326
或者以更易读的方式:
$ for p in $(ps -o pid -t pts/138 |tail -n +2)
do
awk -v PID=$p '{print $22,PID}' /proc/$p/stat 2>/dev/null
done | sort -g | head -1 | awk '{print $2}'
13326