スクリプト
#!/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)が終了し、どのスクリプトによって終了されるかを印刷します。たぶんそのことが起こった時も、どれくらいの間実行されたのかもしれません。
失敗しなかっただけでなく、実際に見つかった割合を報告するのに役立ちます。これは成長を監視するのに役立ちます。この場合、平面とも表示されます。