#!/BIN/BASH
# To alert whenever lsof crosses 80%
maxlimit=32000
echo 'Max limit is ' $maxlimit
tlimit=$(bc <<< $maxlimit*0.8)
echo 'Treshold limit at 80% ' $tlimit
a=$(lsof | wc -l)
echo 'Current usage ' $a
if [ $(bc <<< "$a > $tlimit") -eq 1 ]
then
echo 'lsof =' $a 'has exceeded 80% of maximum limit' | /usr/bin/Mail -s "ALERT!!!" "*****@cisco.com"
fi
* * * * * bash /root/vasanth/lsef/script.sh
위 스크립트에서 출력은 해당 메일 ID로 이메일을 보내는 것입니다.
수동으로 실행하면 메일이 전송됩니다.
그러나 cron에 예약된 경우에는 메일이 전송되지 않습니다.
문제가 무엇인지 이해하지 못합니다. 어떻게 디버깅할 수 있나요?
답변1
이와 같은 cron 작업의 주요 문제점은 쉽게 디버깅할 수 없다는 것입니다.
일반적으로 cron 작업은 자동으로 작동해야 합니다.오류가 없는 경우, 그러나 오류가 발생하면 매우 자세하게 설명해야 합니다.
EgorVasilev의 답변을 확장하면 다음 명령을 통해 bash 스크립트에서 "디버그 모드"를 쉽게 켤 수 있습니다.
#!/bin/bash -x
exec 2>>/var/log/cron.log
주문하다. 첫 번째는 flags를 통해 스크립트를 해석합니다 -x
. 즉, 실행된 모든 명령을 stderr로 가져옵니다.
exec 2>>/var/log/cron.log
명령 이란 무엇입니까?아무것도하지 마세요, 대신 추가 모드에서 표준 오류를 로그 파일로 리디렉션합니다. 본질적으로 쉘 인터프리터는 주어진 리디렉션을 사용하여 자체적으로 "재실행"됩니다.스크립트 실행 컨텍스트를 변경할 필요도 없습니다..
답변2
1.첫째: #!/bin/bash
대신 사용#!/BIN/BASH
#!/BIN/BASH
다음과 같은 스크립트를 실행 하면 :
bash script.sh
..모든 것이 정상입니다.
그러나 다음을 실행하면:
./script.sh
..오류가 발생합니다:
-bash: ./script.sh: /BIN/BASH: bad interpreter: No such file or directory
2.다음 명령을 실행하십시오.
echo 'PATH='$PATH
스크립트 시작 부분에 출력을 추가합니다.
예:
# echo 'PATH='$PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin