tty
コマンドを使用したり、解析(開いてリダイレクトされないと仮定)など、特定のプロセスに関連付けられたPTSを取得する方法はいくつかありますが、/proc/self/fd/0
その逆の場合はどうですか? ptsを実行しているシェルのPIDを取得するには?
同様のものを試してみることはできますが、ps -t $(tty)
ルートシェル(複数のシェルインスタンス、長期実行システムの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