프로세스가 실행 중인지 테스트할 수 있도록 매우 간단한 스크립트를 설정했습니다. 실행 중인 경우 파일을 건드리면 모든 것이 정상이 될 것입니다. 하지만 프로세스가 실행되고 있지 않고 파일을 건드리지 않은 경우 경고를 설정할 수 있었으면 좋겠습니다.
pgrep "sleep" >/dev/null && 터치 monitor.log
이 스크립트는 매분마다 crontab에서 실행됩니다. 파일을 터치하지 않았을 때 경고를 표시하는 방법이 필요합니까? 가능합니까?
감사해요
답변1
이것은 간단한 파일 수정 시간 확인입니다. 복잡성은 주로 하루에 최대 86,400개의 경고가 나타날 수 있다는 사실(보통 긴 휴일 주말에 이런 일이 발생함)과 수정 시간 검사기(또는 cron 또는 시스템... .) 추가 복잡성. .)이 실제로 실행 중이고 호스트 시계가 정확합니까(virt의 시간 차이, 향후 4년 후의 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
아마도 고려해 보세요표준 모니터링 프레임워크, 파일 수정 시간 확인 또는 이를 위한 플러그인, 사용자 정의 가능한 경고, 메트릭, 위보다 더 나은 코드 등을 지원할 수 있습니다.