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)가 종료되고 어떤 스크립트에 의해 종료되는지 인쇄합니다. 어쩌면 그 일이 일어났을 때도, 얼마나 오랫동안 실행됐을 수도 있습니다.

실패하지 않았을 뿐만 아니라 실제로 발견된 비율을 보고하는 데 도움이 됩니다. 이는 성장을 모니터링하는 데 도움이 됩니다. 이 경우 평면이라는 것도 표시됩니다.

관련 정보