0

top コマンド出力をテキスト ファイルに書き込んでいます。メモリ使用率を計算し、メモリ使用率が 90% を超えた場合にメールを送信する簡単な bash スクリプトを作成しようとしています。

これが私がこれまでに持っているbashスクリプトです。

#!/bin/bash
top -n 1 -b | grep "Mem" > /home/modadm/top-output.txt
MAXMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 7-14 
USEDMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 25-31
$USEDPCT='echo $USEDMEM / $MAXMEM * 100 | bc'
$USEDPCT | mail -s "Test Email from MOD Server" test@test.com

スクリプトを保存して実行すると、「No such file or directory」というエラーが表示されます。

-bash-3.2$ ./memcheck.sh
./memcheck.sh: line 4: =echo $USEDMEM / $MAXMEM * 100 | bc: No such file or directory
Null message body; hope that's ok
-bash-3.2$ 

誰か助けてくれませんか?私は bash スクリプトの初心者で、これが私の最初のスクリプトです。

ありがとうございました

4

5 に答える 5

4

他の回答の内容は繰り返しません。top代わりに、システム メモリの使用状況に関する情報だけが必要な場合に、の出力を解析することの賢明さに疑問を呈します。

の出力はtop人間を対象としており、プロセスごとの多くの情報が含まれており、これらは不要であり、生成するのに費用がかかります。の出力はfree、この特定の用途にはるかに適しています。

次に、スクリプトの計算から判断すると、Linux やその他の Unix 系システムでシステム メモリの使用量を測定する方法を理解していないようです。他のOS とは異なり、使用メモリ サイズには、ディスク キャッシュおよびその他のバッファに使用されるメモリが含まれます。しばらく稼働しているシステムでは、空きメモリがゼロに近づく傾向があります。未使用のメモリは無駄なメモリです。

プロセスによって使用されるメモリの量を見つけるための最初のステップは、使用されたメモリ サイズからバッファに使用されるメモリの量を差し引くことです。しかし、それでも最新のシステムでは十分ではありません-freeこの古い私の回答でtop述べたように、ある程度間違っています。

于 2012-08-25T06:56:08.287 に答える
2

他の人があなたのコードの問題を指摘していますが、これにははるかに簡単なオプションがあります。つまり、top出力をまったく解析しないことです。/proc/meminfoと- を使用するawkと、一時ファイルは必要ありません。

$ awk '/MemTotal:/{total=$2} \
       /MemFree:/{free=$2} \
       END{ \
        print "Free mem percent: "(free*100/total); \
        print "Used mem percent: "((total-free)*100/total) \
       }' /proc/meminfo 

Free mem percent: 87.7348
Used mem percent: 12.2652

それを、またはあなたが望むものにパイプしmailます。

于 2012-08-25T11:59:01.620 に答える
2

ここでいくつかの問題があります。

まず、これはあなたがやりたいことをしません。

USEDMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 25-31

ファイル名をコマンドにパイプすることはできません。実際には、ファイルの内容をコマンドにパイプする必要があります。「猫」でそれを行うことができます。ただし、grepは実際にはファイル内を検索するように設計されているため、次のことができます

USEDMEM=$(grep "Mem" /home/modadm/top-output.txt | cut -c 25-31)

$(cmd) は、サブシェルでコマンドを実行する方法であることに注意してください。つまり、いくつかのコマンドを実行して、スクリプト内の変数の値を計算できます。`cmd` (バッククォート; 通常はチルダ キー) を使用することもできますが、その構文はあまり明確ではありません。

繰り返しますが、おそらくこの結果をサブシェルで計算したいと思うでしょう。また、変数に割り当てるときに $ を使用しないでください。

$USEDPCT='echo $USEDMEM / $MAXMEM * 100 | bc'

これは次のように書き直すことができます。

USEDPCT=$(echo "scale=3; $USEDMEM / $MAXMEM * 100" | bc)

最後に、変数の内容をメール プログラムにパイプします。パイプは、プログラムが左側にあることを期待しています。これを行うには、変数の値をパイプにエコーします。

echo "$USEDPCT" | mail -s "Test Email from MOD Server" test@test.com

すべてを元に戻すには:

#!/bin/bash
top -n 1 -b | grep "Mem" > /home/modadm/top-output.txt
MAXMEM=$(grep "Mem" /home/modadm/top-output.txt | cut -c 7-14)
USEDMEM=$(grep "Mem" /home/modadm/top-output.txt | cut -c 25-31)
USEDPCT=$(echo "$USEDMEM / $MAXMEM * 100" | bc -l)
echo "$USEDPCT" | mail -s "Test Email from MOD Server" test@test.com
于 2012-08-25T04:02:04.243 に答える
0

構文エラーを修正しました。Pl。あなたが書いたように、コマンド置換の使用に注意してください

MAXMEM=/home/modadm/top-output.txt | grep "Mem" | cut -c 7-14.

これは間違っています、あなたは書く必要があります

 grep "Mem" /home/modadm/top-output.txt | cut -c 7-14

それを逆引用符 (タブ キーの上の左側のキー) で囲み、変数に最終的な値を割り当てます。また、あなたは書いた、

$USEDPCT='echo $USEDMEM / $MAXMEM * 100 | bc'

ドル記号の使い方が間違っています。変数の値を使用する場合は、$ を使用する必要があります。引用符は、' (シングル クォーテーション) ではなく ` (バック クォーテーション) にする必要があります。逆引用符は、コマンドがコマンドの出力に置き換えられることを意味します。また、浮動小数点 bc の場合、スケールを設定する必要があります。

Pl。変更されたコードを参照してください。お役に立てれば。Pl。注意メールコマンドがメールを送信しているかどうかの機能を確認していません。

top -n 1 -b | grep "Mem" > /home/modadm/top-output.txt
MAXMEM=`grep "Mem" /home/modadm/top-output.txt | cut -c 7-14`
USEDMEM=`grep "Mem" /home/modadm/top-output.txt | cut -c 25-31`
USEDPCT=`echo   "scale=2; $USEDMEM / $MAXMEM * 100" | bc `
echo $USEDPCT | mail -s "Test Email from MOD Server" test@test.com
于 2012-08-25T04:00:06.127 に答える
0

次のスクリプトを試してください。

#! /bin/bash

memusage=`top -n 1 -b | grep "Mem"`
MAXMEM=`echo $memusage | cut -d" " -f2 | awk '{print substr($0,1,length($0)-1)}'`
USEDMEM=`echo $memusage | cut -d" " -f4 | awk '{print substr($0,1,length($0)-1)}'`

USEDMEM1=`expr $USEDMEM \* 100`
PERCENTAGE=`expr $USEDMEM1 / $MAXMEM`%

echo $PERCENTAGE | mail -s "Test Email" test@test.com
于 2012-08-25T04:02:41.900 に答える