Shell-Script

如果程序停止觸摸文件,則創建警報通知

  • November 30, 2016

我已經設置了一個非常簡單的腳本,這樣我就可以測試一個程序是否正在執行,如果是,那麼它將觸及一個文件,一切都會好起來的。但是,如果程序沒有執行並且文件沒有被觸及,那麼我希望能夠設置一個警報。

pgrep “sleep” >/dev/null && touch monitor.log

該腳本每分鐘在 crontab 中執行。如果文件沒有被觸及,我需要一種方法來提醒它?這可能嗎?

謝謝

這是一個簡單的文件修改時間檢查;複雜性主要來自每天多達 86,400 個警報的可能性(通常在長假週末是這類事情發生的時候),以及是否修改時間檢查器(或 cron 或系統.. .) 是否正在實際執行,主機時鐘是否正確(virts 上的時間偏差、四年後的 BIOS 時鐘、損壞的 NTP 等)。

#!/bin/sh

# what we're checking for mtime changes straying from the current system time
MONITOR=foofile
THRESHOLD=60

# use mtime on this file to avoid frequent alert spam should the above stop
# being updated
LAST_ALERT=barfile
LAST_ALERT_THRESHOLD=60

NOW_MTIME=`date +%s`

absmtimedelta() {
   delta=`expr $NOW_MTIME - $1`
   # absolute delta, in the event the mtime is wrong on the other side of
   # the current time
   echo $delta | tr -d -
}

alertwithlesscronspam() {
   msg=$1
   if [ ! -f "$LAST_ALERT" ]; then
       # party like it's
       touch -t 199912312359 -- "$LAST_ALERT"
   fi
   # KLUGE this stat call is unportable, but that's shell for you
   last_mtime=`stat -c '%Y' -- "$LAST_ALERT"`
   last_abs_delta=`absmtimedelta $last_mtime`
   if [ $last_abs_delta -gt $LAST_ALERT_THRESHOLD ]; then
       # or here instead send smoke signals, carrier pigeon, whatever
       echo $msg
       touch -- "$LAST_ALERT"
       exit 1
   fi
}

if [ ! -r "$MONITOR" ]; then
   alertwithlesscronspam "no file alert for '$MONITOR'"
fi

MONITOR_MTIME=`stat -c '%Y' -- "$MONITOR"`
ABS_DELTA=`absmtimedelta $MONITOR_MTIME`

if [ $ABS_DELTA -gt $THRESHOLD ]; then
   alertwithlesscronspam "mtime alert for '$MONITOR': $ABS_DELTA > $THRESHOLD"
fi

也許可以考慮一個標準的監控框架,它可能支持文件修改時間檢查或外掛,可定制的警報、指標、比上述更好的程式碼等。

引用自:https://unix.stackexchange.com/questions/327141