pstree
シェルスクリプトを実行している親エミュレータの名前を見つけるために、次のようなものを使用したことがあります。
pstree -s $PPID | awk -F '---' '{print $6}'
これは現在のシステムで動作します。mate-terminal
私はテストしましたが、xterm
これが他のLinuxシステム/プラットフォームや他の端末で動作するかどうかはわかりません。これを達成するためのより良い/よりきれいな(より移植可能な方法)方法はありますか?
ベストアンサー1
ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"
良い結果をもたらすことができます。セッションリーダーの親プロセス名を指定します。ターミナルエミュレータで起動されたプロセスの場合、これは通常、そのターミナルエミュレータを実行するプロセスです(screen
、、expect
...などを使用しない限り、tmux
screen
tmux
はいsetsid
端末エミュレータ)またはstart-stop-daemon
明示的に...)を使用して新しいセッションを開始します。
あるいは、変数を使用して別々のステップに分けます(これはスクリプトをより簡単に説明するのに役立ちます)。
sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")
ここで、数字の周りの空白の除去は$((...))
算術拡張を使用して行われます。 Split + glob演算子(修正がないと仮定$IFS
)を使用したり、コメントで提案された@ackを使用したりすることもできますxargs
。
ps -o sid= -p "$$" |
xargs ps -o ppid= -p |
xargs ps -o comm= -p
一般wtmp
に、端末エミュレータによって記録された項目と疑似端末装置を使用する関連PIDを解析することもできます。予想/画面/tmux...が関連付けられていない場合は、Debianシステムで動作します。
ps -o comm= -p "$(
dump-utmp -r /var/log/wtmp |
awk -v tty="$(ps -o tty= -p "$$")" -F ' *\\| *' '
$2 == tty {print $5;exit}')"
(dump-utmp
GNUからacct
)。