私はすべてのサーバーでNTPサービスを確認し、その結果を特定の電子メールで送信するシェルスクリプトを作成しました。手動で実行すると、正常に機能し、有効なコンテンツを含む電子メールが届きます。
ただし、同じユーザーに対してcronjobに入れると、空のメールが送信されます。 cronjobを実行すると、ファイルに/tmp/ntp_status.txt
情報が保存されていないことがわかりました。ただし、手動で実行すると詳細が更新されます。何が欠けているのかわかりません。 rootユーザーに対して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 オフセット監視と測定を実装します。これをグラフで表示し、特定のしきい値に基づいて通知をトリガーします。
構成管理ソフトウェアを使用してサービスの状態を確認してください。