シングルユーザーの状況で、の例をとると、xterm
のPIDの数を数えるだけxterm
です。xterm
ウィンドウごとに個別のPIDを作成します。
gnome-terminal
ただし、単一のpidを実行しますが、良いニュースは、すべてのウィンドウやタブごとに子プロセスを作成することです。次のコマンドでこれらの子プロセスを取得できます。
pgrep -P <pid_of_gnome-terminal>
ただし、対処するいくつかの複雑な問題があります。
あなたの質問を読んで、この場合のユーザーは実際にはx-sessionの所有者であると想定するかもしれません。通常、単に$USER
-variableを使用できますが、これは、現在ログインしているのユーザーと一致しない場合があり$DISPLAY
ます。
マルチユーザーの状況では、(どちらの)端末アプリケーションに属しているPIDが必ずしも現在のに属しているとは限りません$DISPLAY
。関連するpidとchild-pidのみを分割する必要があります。
Unity(15.10以下)では、2番目のユーザーがログインすると、追加のプロセスが開始され(gnome-pty-helper
)、これはで子プロセスとして表示されますgnome-terminal
が、プロセスには(明らかに)ウィンドウまたはタブがありません。上メイト、プロセスはとにかく存在します。
要するに
端末アプリケーションのタブやウィンドウの数を数えるには、次のことを行う必要があります。
- 複数のPID または 1つのPID
$DISPLAY
(Xセッション)を持つターミナルアプリケーションを実行しているかどうかを確認します
- 実行中のプロセスから、関連するPID のみを分割し、これで実行します
$DISPLAY
- アプリケーションがpid(windows / tabsの場合)の子プロセスを実行する場合は、実行されているかどうか
gnome-pty-helper
を確認して、数を修正してください。
ただし、現在開いているウィンドウやタブの数を確実に見つけるために、これは非常にうまくスクリプト化できます。
スクリプト
以下のスクリプトでは、ターゲットの端末アプリケーションが引数として使用されています。このスクリプトは、テストした多くの端末で動作します。Tilda
現時点では例外です。
例
- 2人のユーザーがログインしています。1人(現在ではない)に2つの
gnome-terminal
ウィンドウ、1人(画像の1人)に3つのgnome-terminal
ウィンドウ、2つのxterm
ウィンドウがあります。
コマンド:
/path/to/get_terms.sh gnome-terminal
出力:
3
ながら
/path/to/get_terms.sh xterm
出力:
2
スクリプト
#!/bin/bash
terminal=$1
# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print $1}')
# get the pid of the terminal for the current user
userpid=$(pgrep -u $username $terminal)
# check what type the terminal is (multi pid/single pid)
npids="$(echo "$userpid" | wc -w)"
# in case of a single pid, count the children
if [ "$npids" -eq 1 ]; then
# check if gnome-pty-helper runs (starts when multiple users are logged in)
ptpid=$(pgrep gnome-pty-helpe)
# get number of child- procs
let "orig = $( pgrep -P $(pgrep -u $username $terminal) | wc -w )"
# if pty-helper runs, correct the number of child procs
if [ -n "$ptpid" ] && [ -n "$userpid" ]; then
let "n_terms = $orig-1"; else let "n_terms = $orig"
fi
# if no child procs run, n-terminals = n-counted pids (difference Mate <> Unity)
if [ "$n_terms" -eq 0 ]; then echo $orig; else echo $n_terms; fi
# in case of multiple pids, count the pids
elif [ "$npids" -gt 1 ]; then echo $npids
fi
使用するには
tty
。私たち/他の人たちはその「質問」に集中しすぎて、「必要性」全体に他の解決策があるかもしれないことを忘れていたと思います:)ランダムカラーセレクターの実装を試してみます。256色の場合、同じ/類似の色を選択することはあまりありません。ただし、指定されたpts番号の色を手動で設定すると、パーソナライズが向上します。