2010-01-29 04:03:01 +0000 2010-01-29 04:03:01 +0000
26
26

ps -ef'を実行した場合、各プロセスのメモリ使用量を表示するにはどうすればいいですか?

Linuxでps -efをした場合、各プロセスのメモリ使用量を表示するにはどうすればいいのでしょうか?各プログレスの「仮想メモリ」「resメモリ」「共有メモリ」を見たいのですが、topで取得できますが、同じ情報がps -efで欲しいのです。grepで取得できますが、同じ情報を0x6&で取得して、自分のプロセス名で0x6&に出力できるようにしたいです。

回答 (8)

11
11
11
2015-03-11 13:16:28 +0000

user26528さんの回答では、メモリを正しく計算していません - トップのものだけでなく、smaps内のマッピングの合計が必要です。このスクリプトで計算してみましょう。

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [-f /proc/$pid/smaps]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done
11
11
11
2010-01-29 07:09:40 +0000

ps ef -o command,vsize,rss,%mem,size

共有メモリのオプションは見つかりませんでしたが、総物理メモリの%とプロセスをスワップアウトするのに必要なスワップスペースの量のオプションは見つかりました。この他にも多くのことが ps の man ページに記載されています。

8
8
8
2012-02-04 10:26:12 +0000

メモリ使用量別にプロセスを一覧表示

ps -e -orss=,args= | sort -b -k1,1n

7
7
7
2010-01-29 11:20:18 +0000

ps を使ってメモリ使用量を取得するのはかなり信頼性が低いです。新しいカーネルを使用している場合は、/proc/pid#/smaps をサポートしている必要があり、各プロセスのメモリ使用量に関する詳細な情報を得ることができます。以下は、開いている各プロセスをループして、サイズ、Rss、Pss、共有クリーン/サーティの使用量を取得するための、かなり汚くて素早いスクリプトです。何らかの形で役に立つことを願っています。

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [-f /proc/$pid/smaps]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done
4
4
4
2010-01-29 04:20:47 +0000
top -n 1
```0x1&を使うことができます。
3
3
3
2016-09-23 15:51:44 +0000

更新:

以下のワンライナーでも、現在のユーザーの総メモリ消費量の情報が表示されます。

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

こんな感じで、メモリ使用量の多いMB順に並べた全ユーザープロセスを一覧にしてみました。

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

フルパスプロセスを表示するには、command= の代わりに comm= を使用することができます。

= はカラムのタイトルを削除するだけです。

3
3
3
2017-04-04 12:27:34 +0000

例えば、google chromeが複数のプロセスを起動していて、そのプロセスが使用しているメモリの総量を知りたいとします。以下の一行コマンドがとても便利です。

echo "%CPU %MEM MEM PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

これはメモリをMB単位で表示したり、メモリをソートしたり、主にコマンドでグループ化したりと色々なことをしてくれます。また、%CPUと%memoryをグループ化しています。これは、ユーザ・フレンドリーな形式でデータを表示しています。

このコマンドは この の回答からヒントを得たもので、どのプロセスがリソースを消費しているかを知るのに非常に役立ちました。

3
3
3
2014-12-05 07:40:22 +0000

メモリ使用量によるプロセスの一覧表示

command : ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

関連する質問

6
10
5
37
5