Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 事件触发一次,而不是每次脚本运行时_Bash_Conditional Statements - Fatal编程技术网

Bash 事件触发一次,而不是每次脚本运行时

Bash 事件触发一次,而不是每次脚本运行时,bash,conditional-statements,Bash,Conditional Statements,我使用下面的脚本在myhost关闭时通过电子邮件通知我 我每分钟都在crontab中运行这个脚本 问题是:每当我的主机停机时,它每分钟都会提醒我主机停机是由crontab每分钟触发的 我想做的是: 当我的主机停机时,我只希望被提醒一次。因此,如果主机停机30分钟,我希望收到一次警报,而不是30次 2. 当myhost再次启动时,我希望有另一个myhost再次返回的警报 多谢各位 #!/bin/bash ping -c 1 www.myhost.com > /dev/null 2>&a

我使用下面的脚本在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循环是多余的。循环将始终在第一次迭代时退出。

我正在考虑在文件中的脚本外部编写一个标志。但是,是否可以在脚本内部执行而不在文件系统上写入?感谢while提示。@fastlearner-您必须将信息写入文件系统。我想您可以编辑脚本本身来记录上一个状态,并在状态更改时发送电子邮件,或者自上次更改以来已过了很长时间,您希望在电子邮件中确认当前状态,但这不是通常的做法。是否可以使脚本在后台循环运行?只是为了避免每分钟都使用crontab?是的,您可以在每次迭代中使用sleep。但您必须在重新启动时重新启动它,并且cronjob在出现故障时更可靠。睡眠不是为了保持在后台,而是为了延迟,如果您希望它每分钟只运行一次的话。例如,您可以在后台通过向命令行添加&来运行它。你有很多问题。我认为读一本关于shell脚本的书会很好。我在你的脚本中没有看到任何东西看起来像是试图实现每30分钟只通知一次规则,或者up通知。看看类似于或的工具,看看这类功能如何,这样您就可以将其放入配置文件或web UI中,而不是代码本身?事实上,脚本并不包含这些内容,这是我正在努力创建的。我想手动编写代码。太好了!当你写了这些代码后,一定要问一些关于你在代码中遇到的任何问题的问题但与此同时,你有问题吗?