シェルスクリプトを使用して、スリープ状態のプロセスの数をカウントするにはどうすればよいですか?
詳細な説明...宿題だからすべてを取り入れると信じて...
ps
コマンドを使用してプロセスを一覧表示する
$ ps
PID TTY TIME CMD
4879 pts/3 00:00:00 bash
5003 pts/3 00:00:00 ps
ああ、これは現在のセッションのプロセスのみを示しています。システム内のすべてのプロセスを表示します。そのために-e
フラグを使用できます
$ ps -e
PID TTY TIME CMD
1 ? 00:00:05 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
[and many more lines]
しかし、どのものが眠っているのかをどのように示しますか?
-l
オプションまたはu
オプションを使用できます。これにより、プロセスの状態を含む詳細が表示されます。スリープ状態のプロセスには、STAT列にS
またはD
という文字があります
man ps
から
プロセス状態コードプロセスの状態を説明するためにs、statおよびstate出力指定子(ヘッダー「STAT」または「S」)が表示するさまざまな値を以下に示します。
D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped by job control signal t stopped by debugger during the tracing W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent
ps
出力をフォーマットして、状態のみを表示し、簡単にカウントできるようにすることができます。
ps -e -o state
ここでは、-e
を使用してすべてのプロセスと-o
フラグを取得し、その後に必要な出力のタイプを続けます。このコマンドは状態文字のみを出力します。次に、この出力をgrep
にパイプ(|
を使用)して、スリーププロセスであるS
またはD
の行をカウントできます。
ps -e -o state | grep -cE 'S|D'
grep
はテキストを検索します。 -c
オプションは、見つかったテキスト自体を出力するのではなく、一致のみをカウントするように指示します。 -E
オプションは、拡張正規表現を使用するようgrep
に指示するため、|
文字を使用して、式= thing|stuff
を使用して、thing OR stuffに一致させることができます。正規表現を使用する場合は、単一引用符を使用して、シェルによる展開を防ぎます。
ps
コマンドが、スリーププロセスのステータスを、割り込み可能なスリープのS
および割り込み不可能なスリープのD
として出力することを知っていれば非常に簡単です。また、-o s
フラグを使用してそれらの状態。あとは、grep
を介して出力を実行するだけで、これらのフラグの発生をカウントします。そのようです:
$ ps -e -o s | grep -o 'S\|D' -c
260
別の方法は、次を使用して各状態のプロセス数をリストすることです。
$ ps -e -o state | sort | uniq -c
1 R
141 S
top
ユーティリティは、実行中のタスク数とスリープ中のタスク数を示すタスク数を提供します。もちろん、それは時々刻々と変化しますが、これらのワンライナーの出力も変化します。他の* nixユーティリティと同様に、man
ページに詳細が表示されます。