実行中のシェル/ターミナルの数を数える方法は?


10

現在実行中のシェルまたはターミナルウィンドウの数を数えようとしています。

私は試した ps a|grep bash; ps a|grep tty;

しかし、それは不正確な場合があります。


端末ウィンドウの定義は何ですか?gnome-terminalタブ、仮想端末、ssh経由でログインしている人、screen / tmuxペイン、expectエミュレートされたユーザーセッション、xtermシェルを実行していない、などはカウントしますか?
ステファンChazelas

1
「ctrl-alt-t」で開いた端末ウィンドウ。> whoコマンド who | grep "pts" | wc -l
Martincho

回答:


6
ls /dev/pts/  | wc -l

上記のコマンドを使用して、開いているターミナルウィンドウをカウントします。


それを試しました。23と表示されています。ターミナル/ bashウィンドウは1つしか開いていません。
Martincho、2014年

@ user68957万が一、複数のユーザーがいる共有コンピュータを使用していますか?
Chirag Bhatia-chirag64 2014年

一度に1台のホームコンピューター、1人のユーザー。トリックは、開いているターミナルウィンドウの数、またはターミナルプロセスをカウントすることです。> whoを実行すると、2人のユーザーが表示されます:0 yyyy-mm-dd hh-mm(:0)me pts / 0 yyyy-mm-dd hh-mm(:0)別のターミナルウィンドウを開いた場合、 >誰が表示するか:me:0 yyyy-mm-dd hh-mm(:0)me pts / 0 yyyy-mm-dd hh-mm(:0)me pts / 1 yyyy-mm-dd hh-mm(: 0)「pts /」をgrepするだけですか?
Martincho、2014年

2

それらをリストするには:

ps aux | awk '{print $7}' | grep -v "?"

それらを数えるには:

ps aux | awk '{print $7}' | grep -v "?" | wc -l

上部のTTYヘッダーが含まれているため、その番号から1を引く必要があります。

これは、実行中のサブシェルの数を数えたいか、開いているターミナルウィンドウの数を数えたいかによって異なります。

ターミナルウィンドウだけを数えるには、次のようにする必要があります。

ls /dev/pts/ | wc -l (stated in a previous answer)

例えば:

私のシステムでは、現在6つのttyが利用可能です。また、fgまたはbgで4つのプロセスが実行されている1つのターミナルオープンpts / 0があります。

root      4565  0.0  0.0   4060   576 tty1     Ss+  May01   0:00 /sbin/mingetty /dev/tty1
root      4567  0.0  0.0   4060   572 tty2     Ss+  May01   0:00 /sbin/mingetty /dev/tty2
root      4569  0.0  0.0   4060   568 tty3     Ss+  May01   0:00 /sbin/mingetty /dev/tty3
root      4571  0.0  0.0   4060   576 tty4     Ss+  May01   0:00 /sbin/mingetty /dev/tty4
root      4573  0.0  0.0   4060   576 tty5     Ss+  May01   0:00 /sbin/mingetty /dev/tty5
root      4575  0.0  0.0   4060   572 tty6     Ss+  May01   0:00 /sbin/mingetty /dev/tty6

me  17482  0.0  0.0 110236  1136      pts/0    R+   11:36   0:00 ps aux
root     20374  0.0  0.0 108336  1816 pts/0    Ss   May23   0:00 -bash
root     20953  0.0  0.1 161436  1960 pts/0    S    May23   0:00 su - me
me  20954  0.0  0.1 108524  1984      pts/0    S    May23   0:00 -bash

バックグラウンドの子プロセスを取り除きたい場合は、uniqにパイプします。

ps aux | awk '{print $7}' | grep -v "?" | uniq | wc -l

TTYのヘッダータイトルには1を引く必要がありますが、ttyを完全に削除することでさらに改善できます。

ps aux | awk '{print $7}' | grep -v "?" | grep -vi "tty*" | uniq

これにより、正確なカウントが得られます。

編集

それについてもっと 'ps -a'を考えるとうまくいき、最初のgrepを省くことができます。

ps a | awk '{print $2}' | grep -vi "tty*" | uniq | wc -l

grepそしてawk冗長です、使用してくださいawk '/pattern/; そして、これは私のマシンでは機能しません-私が1を持っているときに19を報告します
jasonwryan

私は少し混乱しています。現在、私はUbuntu 14を使用しています。開いているターミナル/ bashウィンドウは1つだけです。abobeコマンドを使用すると、ctrl-alt-tを使用して別のターミナルを開く場合に1または2を取得する必要があるときに、23または13を取得します
Martincho

その最初のコマンドは、開いているターミナルセッションだけでなく、バ​​ックグラウンドでシェルで実行されている子プロセスをカウントします
Jeight

@jasonwryan-私の場合は問題なく動作します。awkでgrepを使用することは、個人の好みです。誰かがawkですべてを快適に行える場合は、それで問題ありません。
Jeight

「私の場合は問題なく機能します」という回答はほとんど実証されません...おそらく「あなたのもの」の詳細を含めて、人々がそのシステムにのみ適用されることを人々が知っているようにすることができます。
jasonwryan 2014年


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.