topコマンドを呼び出すと、実行中のすべてのプロセスが取得されます。しかし、出力を「java」などの特定のプロセス名のみに制限するにはどうすればよいですか?
私はこのトップを試しました -l2 | grep javaです が、この方法ではスナップショットのみを取得し、継続的に更新されるリストは取得しません。そしてトップ-l0 | grepjavaは実際には明確ではありません。
topコマンドを呼び出すと、実行中のすべてのプロセスが取得されます。しかし、出力を「java」などの特定のプロセス名のみに制限するにはどうすればよいですか?
私はこのトップを試しました -l2 | grep javaです が、この方法ではスナップショットのみを取得し、継続的に更新されるリストは取得しません。そしてトップ-l0 | grepjavaは実際には明確ではありません。
回答:
私は次のことを好みます。そうすれば、実行するたびにpidを検索しなくても、topをインタラクティブに使用できます。
top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`
もちろん、プロセスが変更された場合は、コマンドを再実行する必要があります。
説明:
pgrep process-name
改行で区切られたプロセスIDのリストを返しますtr "\\n" ","
topはプロセスIDのコンマ区切りリストを必要とするため、これらの改行をコンマに変換しますsed
はストリームエディタであり、sed 's/,$//'
ここでは末尾のコンマを削除するために使用されますtop: pid limit (20) exceeded
ます。とにかくその制限の周りにありますか?
top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//')
。これにより、によって返される最初の20個までのPIDのデータが表示されpgrep
ます。
-pid
代わりになってい-p
ます。
監視するプロセスの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
(コンマ区切りのリストを渡すこともできると思います。)
@dogbaneの回答を拡張すると、名前付きプロセスのすべてのPIDを取得pgrep
して、次のことを実行できます。
top -p "$(pgrep -d ',' java)"
top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
man top
「このオプションは最大20回指定できます。または、最大20個のpidを含むカンマ区切りのリストを指定できます。」よくやった。
watchコマンドを使用する
watch -d 'top -n1 | grep mysql'
man watch
" watchはコマンドを繰り返し実行し、その出力とエラーを表示します"; 同じように、現在実行中のプロセスが表示されないtop
ん
watch -d 'top -b -n1 | grep mysql'
私はそれを実行します(例): top -b | egrep -w 'java|mysqld'
同じ名前のサーバーで20を超えるプロセスが実行されている場合、これは役に立ちません。
top -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'
それは、より多くのリソースを消費する他のプロセスを見逃す可能性が高い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を持つすべての行が出力されます。ダンプファイルは、より監視しやすいループに使用されます。
MacOSのこれまでの唯一の解決策は次のとおりです。
top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`
ただし、稼働中invalid option or syntax: -pid
のjava
プロセスがない場合、これは望ましくないレポートになります。
説明
ここに掲載されている他のソリューションはこのフォーマットを使用していますtop -p id1,id2,id3
が、MacOStop
は扱いにくいフォーマットしかサポートしていません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 `...`
プロセスのpidを取得します。
# pidof <process>
表示するプロセスpidをトップに指示する
# top -p <pid1>,<pid2>, etc
例:
landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709
Topには、2つの「konsole」プロセスのみが表示されます。これは、sshを介してビジー状態のサーバーで役立ち、grepを介してパイプする必要はありません。
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のリストを「、」で結合します。
上記のコマンドで、探しているプロセス名と、監視したいその名前のプロセスの数を制御できます。head -n 20
指定された名前のプロセスの数が20未満の場合は、その部分を無視できます。