1

それで、コマンド「ps u」に従って、合計でどれだけのCPUが使用されているかを把握する必要があるbashスクリプトを書いています。私は awk を次のように使用しようとしています:

TOTAL_CPU=$(ps u | awk '{sum = sum + $3}; END {print sum}')

コマンド「ps u」からの典型的な出力には 11 列があり、3 番目は CPU 使用率です。

問題は、これが正常に機能していないことです。CPU 値に小数がある場合、次のようなエラーが発生します。

syntax error: invalid arithmetic operator (error token is ".x")

x は、合計後の「残りの」小数です。たとえば、値が「1.4」と「8.7」の場合、合計は「10.1」になるため、エラーは次のようになります。

syntax error: invalid arithmetic operator (error token is ".1")

どうすれば必要なことを行うことができますか? 小数が切り捨てられても問題ありません。多くの精度は必要ありません。

編集:投稿編集者は、私が最初に書いたものを変更しました

EDIT2: 問題が解決しました! awk のせいではありません。このコード行は別の場所に隠れていたことが判明しました。

declare -i TOTAL_CPU

そのため、bash は、整数値のみを含むと予想される変数に「3.4」のような値を割り当てようとしていました。誰かが後でGoogle経由でこの投稿を見つけた場合に備えて、これをここに置きます!

4

2 に答える 2

2

psシステムのマンページにあるコマンドを見てください。ps出力を再フォーマットして、必要なものを取得できます。たとえば、CPUの量を出力するだけで、残りの出力を忘れることができます。

sum=$(ps -udavid -o %cpu | tail -n +2 | paste  -sd+ - | bc)
  • ps -udavid: davidが所有するプロセス
  • ps -udavid -o %cpu:davidが所有するプロセス。CPUを表示するだけ
  • tail -n +2:ヘッダー行を削除します(2行目から最後まで)
  • paste -sd+ -すべての-s行を1行にまとめる手段。d+手段は、各行の後に記号+付けます。最後の手段はSTDINを使用することです。-
  • bc線を計算します。すべての数値は符号で区切られて+いるため、すべてのCPU量が合計されます。
于 2012-11-27T03:54:10.727 に答える
1

次の場所から変更します。

TOTAL_CPU=ps u | awk '{sum = sum + $3}; END {print sum}'

に:

TOTAL_CPU=$(ps u | awk '{sum = sum + $3}; END {print sum}')

これはawk問題ではなく、bash構文です。

$(...)表記はコマンド置換と呼ばれます。基本的に、現在のシェルから新しいサブシェルを生成して、それに含まれるコマンドを実行し、出力を新しいサブシェルのに返しますstdout

于 2012-11-27T00:47:49.057 に答える