与えられたpts / ttyを実行しているシェルのPIDをどのように決定しますか?

与えられたpts / ttyを実行しているシェルのPIDをどのように決定しますか?

ttyコマンドを使用したり、解析(開いてリダイレクトされないと仮定)など、特定のプロセスに関連付けられたPTSを取得する方法はいくつかありますが、/proc/self/fd/0その逆の場合はどうですか? ptsを実行しているシェルのPIDを取得するには?

同様のものを試してみることはできますが、ps -t $(tty)ルートシェル(複数のシェルインスタンス、長期実行システムのPIDの再利用など)を確実に決定するのに十分な情報を提供しません。私が考えることができる唯一の方法は、端末に関連するすべてのプロセスを手動で収集し、各プロセスの/proc項目にアクセスしてプロセス階層を決定し、これが最上位の親プロセスであると仮定することです。

tty単純なリバースコマンドを使用できますか?多くの努力なしにPIDを教えてもらえますか?

ベストアンサー1

コマンドが開始時間ごとのソートをサポートしている場合は、psttyを所有する最速のプロセスを見つけることができます。

$ 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 

おすすめ記事