bash - 不是每次脚本运行时都会触发一次事件
问题描述
我正在使用下面的脚本在 myhost 关闭时通过电子邮件收到通知。
我每分钟都在 crontab 中运行这个脚本。
问题:每当我的主机关闭时,它每分钟都会提醒我主机已关闭(每分钟由 crontab 触发)。
我想做的事:
当我的主机关闭时,我希望只收到一次警报。因此,如果主机停机 30 分钟,我希望收到一次警报,而不是 30 次。
2.
当 myhost 再次启动时,我想要另一个提醒 myhost 又回来了。
谢谢你。
#!/bin/bash
ping -c 1 www.myhost.com > /dev/null 2>&1
status=$?
while true;
do
if [ "$status" -eq 0 ]; then
echo "OK"
exit 0
else
#echo "Ping NOK"
echo "myhost is down" | /usr/bin/mail -s "It happened: myhost is down" myaddr@gmail.com
exit 1
fi
done
解决方案
您必须在脚本之外存储一些状态,以便在下一次独立运行时查看电子邮件已经发送。也许在主机关闭的情况下,您将文件放在某处。如果主机故障已经有一个文件并且它不是太旧,请跳过发送电子邮件。
不可能将状态(可能是一个标志)封装在脚本中,因为在每次执行时(通过 cron),这将是一个具有自己变量的脚本的新实例。
另一件事:while
循环是多余的。循环将始终在第一次迭代时退出。
推荐阅读
- types - 在证明基本函数应用规律时理解 agda 中的类型推断问题
- python - 是否有可能拥有一个只是 python 控制台的 Heroku 应用程序?
- excel - 将整数与单元格属性一起使用
- python - 在 django 中创建一个 Web 应用程序,该应用程序创建一个视频(使用 moviepy)并播放它:从哪里开始?
- angular - 角材料表,使用指令 *ngIf; else 在表内
- python - 解析多种格式的日期
- ios - 更改 ASAuthorizationAppleIDButton 样式的暗/亮模式已打开
- python - 计算组中的滞后差异
- python - 如何在使用 k 折交叉验证训练训练数据后测试数据?
- ms-access - 带有 in 和参数的 MS 访问查询