BASHスクリプトで「整数式が必要」エラー

BASHスクリプトで「整数式が必要」エラー

スクリプト

#!/bin/bash
MEM=`ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | grep -i 4721 | grep -v "grep" | awk '{print $4}'`
PID=4721
while true;
do
if [ $MEM -gt 94 ]; then
printf "mem has exceeded, kill it"
kill -9 $PID
echo "Killed the process"
        exit 0
    else
        echo "SIZE has not yet exceeding"
    fi

    sleep 10
done

出力

[root@ris-n-v10253 ~]# sh ash.sh
ash.sh: line 6: [: 1.3: integer expression expected
SIZE has not yet exceeding

走るps...

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | grep -i 4721 | grep -v "grep" | awk '{print $4}'

1.3

答え1

シェルは整数ではないのが好きではありません(kshを除く)。

簡単な解決策は、awkに%ageを最も近い整数として出力させることです。以下をすべて交換してください。

grep -i 4721 | grep -v "grep" | awk '{print $4}'

これで:

awk -v Pid="${PID}" '$1 == Pid { printf ("%d\n", int (0.5 + $4))' }

他にも多くの改善が可能です。

スクリプトを実行可能にし、sh を指定せずにコマンドで実行します。

PID変数を初期化しましたが、前のコマンドで同じ値をハードコードしました。

ps出力をソートしますが、とにかく行を選択します。

psのcmdフィールドにスペースが含まれている場合、%memフィールドは$ 4にもうありません。実際には、出力ppid、cmd、%cpuがなぜ使用されないのですか?

10秒ごとに永久に繰り返してMEM値を確認します。ただし、ループの前に一度だけ初期化するため、再び変更されません。

より多くの報告を行うことが役に立ちます。

一貫性のために printf または echo を選択します。

どのプロセス(名前とpid)が終了し、どのスクリプトによって終了されるかを印刷します。たぶんそのことが起こった時も、どれくらいの間実行されたのかもしれません。

失敗しなかっただけでなく、実際に見つかった割合を報告するのに役立ちます。これは成長を監視するのに役立ちます。この場合、平面とも表示されます。

関連情報