
내 서버는 높은 로드 평균에 도달하면 항상 종료됩니다. Apache, MySQL을 최적화했습니다. 하지만 교통량이 많은 곳에서는 멈출 수가 없어요. 그래서 로드 평균을 제어하기 위해 쉘을 작성해 보았습니다.
#!/bin/bash
check=`uptime | sed 's/\./ /' | awk '{print $10}'`
if[$check -gt 5]
then
/usr/bin/systemctl restart httpd.service
fi
하지만 스크립트를 용서하면 오류가 보고됩니다.
/var/www/html/load_average.sh: line 3: if[0.98, -gt 5]: command not found
/var/www/html/load_average.sh: line 4: syntax error near unexpected token `then'
/var/www/html/load_average.sh: line 4: `then'
질문 하나 더, cronjob을 사용하여 10초마다 스크립트를 실행하는 방법은 무엇입니까?
모든 사람과 공유할 수 있는 또 다른 작업 코드:
#!/bin/bash
check=$(uptime | tr -d ',' | awk '{print $10}')
if [[ $check > 5 ]]; then
/usr/bin/systemctl restart httpd.service
fi
cronjob 섹션에서
* * * * * /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 10; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 20; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 30; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 40; /var/www/html/load_average.sh >/dev/null 2>&1
* * * * * sleep 50; /var/www/html/load_average.sh >/dev/null 2>&1
답변1
다음과 같이 공백을 사용하여 데이터와 대괄호를 구분해야 합니다.
for I in 0 1 2 3 4 5; do
check=$(uptime | tr -d ',.' | awk '{print $10}')
if [ "$check" -gt 5 ]; then
/usr/bin/systemctl restart httpd.service
fi
sleep 10
done
UNIX에서 [는 실제로쉘 명령. 쉘이 $check 변수를 해당 값으로 바꾸면 결과 명령을 찾으려고 시도하므로 오류가 발생합니다. 또한 $check 변수를 빈 문자열이나 공백으로 대체한 것처럼 인용하는 것이 좋습니다. 그러면 구문 오류가 발생합니다.
crontab 문제와 관련하여 다음을 실행하십시오.크론탭 -e파일에 다음과 같은 항목을 추가하십시오.
* * * * * /PATH/TO/YOUR/SCRIPT
Cronjob의 최소 확인 실행 시간은 1분이므로 루프를 사용하여 10초마다 6번 확인을 반복해야 합니다.
답변2
if[0.98, -gt 5]
Bash는 부동 소수점 연산을 수행할 수 없습니다. 이렇게 할 수 있습니다 if (( 98 > 500 ))
. 이중 괄호는 산술 표현식을 허용하고 변수 확장은 자동으로 수행되므로 if (( check > 500 ))
변수가 $check
.
#!/bin/bash
check=$(LC_ALL=C uptime | awk '{print 100*$10 }')
if (( check > 5 ))
then
/usr/bin/systemctl restart httpd.service
fi
백틱은 오랫동안 더 이상 사용되지 않습니다.
그러나 너무 바빠서 웹 서버를 다시 시작하면 방문자가 짜증을 내서 평균 로드가 낮아질 수 있습니다. 작업을 추가하기 때문에 올바른 솔루션으로 고정되지 않습니다. 어쩌면 프로파일러가 병목 현상을 찾는 데 도움이 될 수도 있습니다.
아마도 웹 서버로 인해 발생할 수 있는 로드 평균을 제한하는 더 좋은 방법은 프로젝트 내에 있을 것입니다. 저는 쉘 스크립트를 개선하는 방법에 대한 제안만 제공할 수 있습니다.
LC_ALL 설정은 내 컴퓨터에서만 필요할 수 있습니다. 이 컴퓨터는 기본적으로 독일 환경으로 설정되어 있으며 0.83을 0,83으로 표시합니다. 하지만 틀린 말은 아니다.