1

私はこのコードを持っています:

total=0;
ps -u $(whoami) --no-headers | awk {'print $1'} | while read line; 
                          do vrednost=$(pmap $line | tail -n1 | column -t | cut -d" " -f3 | tr "K" " "); 
                          total=$(( vrednost + total ))
                          echo $total 
                          done
                          echo total: $total

ご覧のとおり、私のコードはすべてのプロセスの使用量を合計しています。時々合計をエコーすると、問題なく動作しますが、最後に...合計を値(echo total: $total)にしたい場合は、まだゼロです。しかし、before(in while)には正しい値があります。

4

5 に答える 5

0

Ignacio の答えは問題ありませんが、プロセス置換は移植性がありません。そして、もっと簡単な解決策があります。合計が計算されるのと同じサブシェルで合計をエコーする必要があります。

... | { while read line; do ...; done; echo total: $total; }
于 2012-05-31T14:09:00.487 に答える
0

これを試して

#!/bin/bash
total=0;
for line in `ps -u $(whoami) --no-headers | awk {'print $1'}`; 
do 
  vrednost=$(pmap $line | tail -n1 | column -t | cut -d" " -f3 | tr "K" " "); 
      total=$(( $vrednost + $total ))
      echo $total 
done
echo "total: $total"
于 2012-05-30T21:33:37.603 に答える
0

必要な余分なプロセスの数を減らしましょう:)

declare -i total=0
for size in $( ps -u $(whoami) --no-header -o vsz ); do
    total+=$size
done
echo $total

まず、さまざまなオプションを使用して、必要なpsプロセス サイズのリストをキロバイト単位で生成します。簡単に計算できるように、「整数」属性で宣言されたパラメーターに現在の合計を保持しながら、bash の for ループを使用してそのリストを反復処理します。必要な金額が に入力されtotal、必要な用途にいつでも使用できます。合計には、psプロセス自体が使用するメモリが含まれます。

使用while(デニスの提案) とプロセス置換の回避 (ウィリアムの提案):

ps -u $(whoami) --no-header -o vsz | { 
  while read -r var; do
    ((total+=$var))
  done
  echo $total
}

(実際のワンライナーについては、 https : dc//stackoverflow.com/a/453290/1126841 から借用したコマンドを次に示します。

ps -u $(whoami) --no-header -o vsz | dc -f - -e '[+z1<r]srz1<rp'

この合計には、psおよびdcコマンド自体によって使用されるメモリが含まれます。)

于 2012-05-30T22:27:24.457 に答える