问题描述
对于上下文,应用程序正在无人值守的系统上运行24/7收集推文。如果存储推文的文件在x分钟内没有变化,我需要检查应用程序是否未意外终止。
有什么想法吗?我考虑过watch
,但是我对bash和Linux还是陌生的。
解决方法
例如,在目录“ tmp”中有一个名为“ tweets”的文件,我们可以运行一个脚本,其中将find与mmin标志结合在一起。我们可以用-5表示最近5分钟内对该文件的任何更改。如果find命令返回的文件数不为0(通过管道传递到wc -l),则运行命令发送电子邮件。
#!/bin/bash
if [[ "$(find /tmp -name "*tweets" -mmin -5 | wc -l)" != "0" ]]
then
echo "There is an issue" | mailx -s alert someone@someemail.com
fi
然后可以将其设置为每隔5分钟运行一次cron作业。
,好吧,如果您说服务不是那么关键,则可以创建一个cronjob来检查特定文件的修改时间,并在满足某些条件时调用警报脚本。
在这种情况下,请用谷歌搜索“ crontab”,“查找mmin”之类的关键字,然后建立您的cronjob。
否则,海事组织(IMO),一个好的方法就是使用类似grafana的东西。您可以在此处定义事件发生时如何通知您或您的团队。
您的程序需要以某种方式注册其状态。例如。普罗米修斯指标。
通过这种方式,您的警报/监视与运行应用程序的服务器分离。您还可以跟踪服务的所有历史状态。
考虑是否在服务器上运行cronjob或shell脚本以检查文件修改时间戳并在发生某些事件时发出警报。如果服务器关闭,您将不会收到警报,当然,您认为服务运行良好。
再次,这取决于您的服务有多重要。
,使用inotifywait
#!/usr/bin/env sh
MONITOREDFILE=/path/to/monitoredfile
TIMEOUT=600 # 600s or 10 minutes
EMAIL=user@example.com
lastmodified="monitoring started on $(date -R)"
while inotifywait \
--quiet \
--timeout $TIMEOUT \
--event 'MODIFY' \
"$MONITOREDFILE"
do
printf '%s has been modified before %s seconds timeout\n' \
"$MONITOREDFILE" $TIMEOUT
lastmodified=$(date -R)
done
printf '!!! ALERT !!!\nFile %s has not been modified since %s seconds\n' \
"$MONITOREDFILE" $TIMEOUT >&2
mailx -s "Stalled file $MONITOREDFILE" "$EMAIL" <<ENDOFMAIL
Monitored file $MONITOREDFILE has not been modified since $lastmodified.
ENDOFMAIL
使用GNU date
获取文件最后一次修改并使循环为空的另一种方法:
#!/usr/bin/env sh
MONITOREDFILE=/path/to/monitoredfile
TIMEOUT=600 # 600s or 10 minutes
EMAIL=user@example.com
while inotifywait --quiet --timeout $TIMEOUT --event 'MODIFY' "$MONITOREDFILE"
do :;done
lastmodified=$(date --utc --iso-8601=seconds --reference="$MONITOREDFILE")
mailx -s "Stalled file $MONITOREDFILE" "$EMAIL" <<ENDOFMAIL
Monitored file $MONITOREDFILE has not been modified since $lastmodified.
ENDOFMAIL