我正在编写一个快速而肮脏的脚本来检测服务器停机时间。我有一台服务器和两个远程客户端,它们每秒 ping 一次服务器以查看它是否已启动。
cron
如果您最多可以运行每分钟一次,我将如何设置任务在客户端计算机上每秒运行一次?完成上述内容的最佳方法是什么?
此外,客户端机器可能会重新启动,程序需要继续运行(类似于此处的 cron)。
while true; do ping -c 1 server | do stuff w/ output;sleep 1;done
要获得“编辑(可能重新启动)”的资格,只需创建一个重新启动循环的初始化脚本。
我知道你问过关于 ping 的问题。还有其他事情需要考虑。
获得“正常运行时间”的一种更合理的方法是使用查询数据库的东西,如 wtpmx、utmp 或其他用于此目的的文件。ping 协议 ICMP 可以并且将被繁忙的系统忽略。错过回报并不总是意味着系统已关闭。或者系统不工作。可能有很多原因。
考虑在现代 UNIX 机器上获得正常运行时间的一种方法:
ssh remoteserver 'uptime'
还要考虑“为什么”你正在ping。
Ping 可用于检查系统是否处于活动状态并响应 ping 数据包,但可能无法告诉您系统是否实际运行。这可能是您肯定想知道的。例如,数据库服务器或邮件服务器可能有一些挂起的进程。所以它对 ping 有响应,但很少做它打算做的事情。您可能想要构建一个比 ping 更有用的命令。我们每分钟登录一次服务器上的 24x7 prod 数据库,并让它运行一个 sql 脚本,该脚本会回应一些无害的东西,比如“OKAY”。例如,
select 'OKAY' from dual;
您可以在以下脚本的帮助下编写一个 cronjob 来实现此目的。
1 * * * * /bin/ping -c2 www.google.com | while read pong; do echo "$(date): $pong"; done >> ~/pings/google.com.log
它每 1 分钟 ping 一次 google.com,并将当前日期和时间的输出记录到文件路径。