Topコマンドを呼び出すと、実行中のすべてのプロセスが取得されます。しかし、どうすれば出力のみを「Java」のような特定のプロセス名にlimit制限できますか?
私はこれを試しましたtop -l 2 | grep Javaしかし、この方法ではスナップショットのみを取得し、継続的に更新されるリストは取得しません。そして、top -l 0 | grep Javaは実際には明確ではありません。
私は次を好むので、実行するたびにpidを調べることなく対話的にtopを使用できます。
top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`
もちろん、プロセスが変更された場合は、コマンドを再実行する必要があります。
説明:
pgrep process-name
は、改行で区切られたプロセスIDのリストを返しますtr "\\n" ","
はtopがプロセスIDのコンマ区切りリストを必要とするため、これらの改行をコンマに変換しますsed
はストリームエディターで、sed 's/,$//'
は、末尾のコンマを削除するためにここで使用されます監視するプロセスのPIDを見つけて、-p
オプションを使用すると、top
コマンドにpidのリストを提供できます。
例:
top -p 18884 -p 18892 -p 18919
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND
18884 user 25 0 672M 95M 9476 S 0.0 1.1 0:02 1 Java
18892 user 25 0 2280M 123M 12252 S 0.0 1.5 0:05 1 Java
18919 user 22 0 1492M 198M 28708 S 0.0 2.4 0:07 1 Java
(コンマ区切りのリストで渡すこともできると思います。)
どのようにtop -b | grep Java
@ dogbane's answer を展開すると、pgrep
を使用して名前付きプロセスのすべてのPIDを取得し、以下を実行できます。
top -p "$(pgrep -d ',' Java)"
watchコマンドを使用します
watch -d 'top -n1 | grep mysql'
here からの回答を使用して、1つのライナーを作成できました
top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')
これはMacOS 10.12(Sierra)で動作します
次のコードは、watchコマンドを使用して5秒ごとにプロセスのリストを更新します。
watch -n 5 -t top -b -n 1 -p$(pgrep Java | head -20 | tr "\\n" "," | sed 's/,$//')
実行します(例):top -b | egrep -w 'Java|mysqld'
私は次を使用して問題を解決しました:
トップ-n1 -b | grep「プロセス名」
この場合:-nはtopが何回処理するかを設定するために使用されます
and -bは、すべてのPIDを表示するために使用されます
次のようなエラーを防ぎます:top:pid limit(20)exceeded
..サーバー上で同じ名前で20を超えるプロセスが実行されている場合...これは役に立ちません
トップ-p pgrep Oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'
より多くのリソースを消費する他のプロセスが失われる可能性が高い20プロセスのリアルタイム出力をリストして提供しようとします。
私はまだこれに関するより良いオプションを探しています
以下を実行すると、コンソールで継続的な更新が行われます。
bcsmc2rtese001 [~]$ echo $Shell
/bin/bash
bcsmc2rtese001 [~]$ top | grep efare or watch -d 'top | grep efare' or top -p pid
27728 efare 15 0 75184 3180 1124 S 0.3 0.0 728:28.93 tclsh
27728 efare 15 0 75184 3180 1124 S 0.7 0.0 728:28.95 tclsh
ちょうどtop -bn 1 | grep Java
はあなたのためにトリックを行います
Rick Byersの回答に記載されているアプローチを使用します。
top -p `pgrep Java | paste -sd "," -`
しかし、20を超えるプロセスが実行されていたため、同様の状況に遭遇した人にとって次のコマンドが役立ちます。
top -p `pgrep Java | head -n 20 | paste -sd "," -`
pgrep
は、指定された名前のプロセスのリストを取得します-Java。head
は、-p引数の使用時にtopが20を超えるpidを処理できないため、最初の20 pidを取得します。最後にpaste
が結合します。 「、」付きのPIDのリスト。
上記のコマンドで探しているプロセス名と、監視したいその名前のプロセスの数を制御できます。指定された名前のプロセスの数が20未満の場合、head -n 20
部分を無視できます。
OSXでこれに対する答えを探してここに来ました。私は最終的にbashとawkで欲しいものを手に入れました:
topfiltered() {
[[ -z "$1" ]] && return
dump="/tmp/top_dump"
rm -f "$dump"
while :; do
clear
[[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
NR<=12 || ($1 in pids)
' >"$dump"
done
}
ログモードでtopをループし、awkでフィルター処理して、pgrepの出力から連想配列を作成します。 Awkは最初の12行を出力します。12行目は列ヘッダーで、次に配列内のキーであるpidを持つすべての行を出力します。ダンプファイルは、より監視可能なループに使用されます。
私が実際に探していたような、より具体的なケース:
Javaプロセスの場合は、jps -q
これによりjpsは$ Java_HOME/binからのツールであり、したがって$ PATHにある必要があります。
MacOSのこれまでのonlyソリューションは次のとおりです。
top -pid `pgrep Java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`
ただし、Java
プロセスが存在しない場合、これはinvalid option or syntax: -pid
を望ましくない形で報告します。
[〜#〜]説明[〜#〜]
ここに投稿された他のソリューションはtop -p id1,id2,id3
形式を使用しますが、MacOSのtop
は扱いにくい形式top -pid id1 -pid id2 -pid id3
のみをサポートします。
そのため、最初に、プロセス名が「Java」であるプロセスIDのリストを取得します。
pgrep Java
これをawk
にパイプして、結果を区切り文字" -pid "
で結合します
| awk 'ORS=" -pid "'
悲しいかな、これは末尾の区切り文字を残します!たとえば、これまでに文字列"123 -pid 456 -pid 789 -pid "
を取得した可能性があります。
次に、sed
を使用して、区切り文字の最後の6文字を削除します。
| sed 's/.\{6\}$//'`
結果をtop
に渡す準備ができました。
top -pid `...`