晚上好,我需要一个 bash 脚本,该脚本遵循以下命令:
ping -c 4 -i "IP"
3 次。每次 ping 必须间隔 10 分钟执行,只有当 3 次都失败时,才会发送电子邮件。你可以帮帮我吗?
前任。
ping -c 4 -i X.X.X.X
执行类型:先ping,如果全部丢包,等待10分钟再次执行ping命令,如果还是失败再执行上次ping,如果失败则发送邮件
#!/bin/bash
HOSTS="X.X.X.X"
pingtest(){
for myHost in "$@"
do
ping -c 4 -i 5 $HOSTS && return 1
done
return 0
}
if pingtest $HOSTS
then
# 100% failed
echo "Server failed" | mail -s "Server Down" [email protected]
fi
但如何重复3次并且只有在丢包失败后才发送电子邮件?谢谢
答案1
如果可以接受使用外部程序,您可以使用监控IP。它是用 C 语言编写的并且相当可配置。与循环并持续执行的 bash 脚本ping
或 cron 作业不同,它每秒可以运行 100 次 ping,同时消耗的 CPU 时间不到 1%。
例如,您可以使用如下内容:
sudo ./monitor-ip --interval 5.0 --missed-max 20 --reset -- 1.2.3.4 \
bash -c 'mail -s "Server Down!" [email protected] <<< "$MONITOR_NOTIFY_REMOTE_ADDRESS unreachable"'
1.2.3.4
这将以5 秒的间隔发送 ping,直到未收到连续 20 个 pong(停机时间为 1 分钟),然后发送电子邮件至[电子邮件受保护]。它将继续以 1 分钟的间隔发送电子邮件,直到状态条件得到解决。
完全披露:我写的监控IP。
答案2
以下是如何获取 ping 结果的示例:
#!/bin/bash
HOST="X.X.X.X"
WAITFOR=5
TIMES=3
ping $HOST -c $TIMES -i $WAITFOR &> /dev/null
pingReturn=$?
if [ $pingReturn -eq 0 ]; then
# It works
echo "Success!!!"
exit 0
else
# No access
echo "Fail"
exit 1
fi
您可以使用您的方法来发送电子邮件,而不是我放入的 echo 语句。您还有三个变量HOST
、TIMES
和WAITFOR
,您可以将它们设置为您想要的值。如果您希望两次 ping 之间间隔 10 分钟,则必须设置WAITFOR
为 value 600
。
答案3
下面的脚本适用于以下场景
#!/bin/bash
echo "enter the hostname or IP of the host"
read h
ping -c1 $h
if [ $? != 0 ]
then
sleep 6
ping -c1 $h
if [ $? != 0 ]
then
sleep 6
ping -c1 $h
if [ $? != 0 ]
then
echo "host $h is not pinging and its not reachable"
mail -s "host $h is not pinging and its not reachable" emailid </dev/null
else
echo "host $h is pinging"
fi
fi
fi