나는 모든 서버에서 NTP 서비스를 확인하고 그 결과를 특정 이메일로 보내는 쉘 스크립트를 작성했습니다. 수동으로 실행하면 제대로 작동하고 유효한 콘텐츠가 포함된 이메일을 받습니다.
그러나 동일한 사용자에 대해 cronjob에 넣으면 빈 이메일이 전송됩니다. cronjob을 실행했을 때 파일에 /tmp/ntp_status.txt
어떤 정보도 저장되지 않은 것으로 나타났습니다. 그러나 수동으로 실행하면 세부 정보가 업데이트됩니다. 무엇이 누락되었는지 알 수 없습니다. 루트 사용자에 대해 cronjob을 예약하더라도 동일한 문제가 여전히 존재합니다. 아래는 내 스크립트와 crontab 항목입니다.
0 12 * * * /root/test/servers_list/ntp.test.sh
#!/bin/bash
USR="root"
# Email
SUBJECT="NTP Service Status Report"
EMAIL="[email protected]"
EMAILMESSAGE="/tmp/ntp_status.txt"
# create new file
>$EMAILMESSAGE
# connect each host and pull up user listing
for host in `cat SAP_Prod_servers_51`
do
echo "--------------------------------" >>$EMAILMESSAGE
echo "* HOST: $host " >>$EMAILMESSAGE
echo "--------------------------------" >>$EMAILMESSAGE
ssh $USR@$host "UP=$(ps -ef | grep -v grep | grep ntpd | wc -l);
if [ "$UP" -ne 1 ];
then
echo "NTP is down.";
sudo service ntpd start
else
echo "NTP Service is running.";
fi" >> $EMAILMESSAGE
done
# send an email using /bin/mail
/bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
답변1
이것이 가능한지 잘 모르겠습니다. ssh 매개변수(명령)의 첫 번째 큰따옴표가 []인 경우 내부에서 이스케이프되지 않고 끝나기 때문입니다. 그곳의 에코에도 동일하게 적용됩니다.
스크립트를 조금 단순화했습니다. 그러나 테스트되지 않았습니다.
#!/bin/bash
USR="root"
FILE=/full/path/to/file/change/this/SAP_Prod_servers_51
# Email
SUBJECT="NTP Service Status Report"
EMAIL="[email protected]"
for host in $(cat "$FILE")
do
echo "--------------------------------"
echo "* HOST: $host "
echo "--------------------------------"
ssh $USR@$host "
if pgrep ntpd >/dev/null
then
echo 'NTP Service is running.'
else
echo 'NTP is down.'
sudo service ntpd start
fi
" 2>&1
done | /bin/mail -s "$SUBJECT" "$EMAIL"
참고: ntpd를 실행한다고 해서 시간이 올바르게 동기화되는 것은 아닙니다.
이러한 서버에 실패한 서비스를 시작할 수 있는 기능이 있는 systemd
경우 .systemd
또한 다음을 고려하십시오.
ntp 오프셋 모니터링 및 측정을 구현합니다. 이를 그래프로 표시하고 특정 임계값을 기준으로 알림을 트리거합니다.
구성 관리 소프트웨어를 사용하여 서비스 상태를 확인하세요.