평균 로드가 특정 임계값에 도달하면 Linux 장치에서 작업/경고를 트리거하는 스크립트를 작성하려고 합니다.
스크립트는 다음과 같습니다.
!/bin/bash
load=`echo $(cat /proc/loadavg | awk '{print $2}')`
if [ "$load" -gt 5 ]; then
echo "foo alert!"
fi
echo "System Load $(cat /proc/loadavg)"
~에 귀속됨helloacm.com여기서 시작하겠습니다.
실행하면 오류가 발생합니다.
./foocheck.sh: line 4: [: 0.03: integer expression expected
이것은 의미가 있습니다. 마침표/소수점을 보고 문자열을 정수와 비교하고 있다고 생각합니다.
이에 대해 제가 찾은 대부분의 솔루션에는 bc -l
장치에서 사용할 수 없는 솔루션이 포함되어 있습니다. 를 사용하지 않고 이러한 값을 비교할 수 있는 방법을 찾아야 합니다 bc
.
답변1
비교에는 정수 부분만 사용할 수 있습니다.
load=$(awk '{print $2}' /proc/loadavg | cut -d. -f1)
답변2
awk를 사용할 수 있고 awk가 부동 소수점 값을 처리할 수 있으므로 다음을 수행하십시오.
awk '($1>5){print("yes")}'
편집된 스크립트:
#!/bin/bash
load=`echo $(cat /proc/loadavg | awk '{print $2}')`
loadtest=$(echo "$load" | awk '($1>5){print("yes")}')
if [ "$loadtest" = yes ]; then
echo "foo alert!"
fi
물론 awk를 사용하면 전체 스크립트를 더욱 단순화할 수 있습니다.
아마도:
#!/bin/bash
awk '($2>5){print("foo alert!")}' /proc/loadavg
답변3
set -- $(cat /proc/loadavg)
load=${2/./}
if [ "$load" -ge 500 ]; then
echo alert
fi
/proc에서 로드 평균을 가져오고 이러한 필드를 기반으로 위치 매개변수를 설정합니다. 두 번째 필드를 잡고 마침표를 제거합니다. 값(현재 숫자)이 500보다 크거나 같으면 경고를 발생시킵니다. 이는 (현재) 부하 평균이 소수점 이하 두 자리까지 표시되는 것을 가정합니다. 감사해요화살더 좋은 방법을 지적해 보세요.
답변4
bash
부동 소수점을 수행할 수 없습니다. 다음 대신에 또는을 zsh
사용 하십시오 .ksh93
yash
#! /bin/zsh -
read ignore load ignore < /proc/loadavg || exit
if ((load > 5)); then
echo >&2 Alert
fi
awk
또는 이미 (불필요한 명령과 함께) 다음을 사용하고 있기 때문입니다 .
#! /bin/sh -
awk '$2 > 5 {print "Alert"}' < /proc/loadavg >&2
또는 sh
if
생성자에서 필요한 경우:
#! /bin/sh -
if awk '{exit !($2 > 5)}' < /proc/loadavg; then
echo >&2 Alert
fi