Как автоматически перезапускать процес после остановки записи в логфайле?
Есть процесс FFMPEG который пишет в лог во время своего выполнения. После пропадания источника процесс зависает и не удаляется. Лог соответственно писаться перестает. Помогите написать скрипт, который бы отслеживал изменения лога и при остановке записи перезапускал процесс.
Ps. есть еще вариант отслеживать по телнету открытый порт
или отслеживать вывод rtmpdump
#!/bin/bash
log=имя_лог_файла
while((`date +%s` - `date +%s -r $log` > 20)); do # если текущее время и время изменения лога больше 20 секунд
# перезапускаем ffmpeg
sleep 5 # проверяем каждые 5 секунд
done
Продолжу тему, предположим 10 камер, каждая пишет в свой лог, как одним скриптом все логи проверять последовательно. Не запускать же 10 скриптов однотипных
Lexaz: можно положить все лог файлы в массив и проверять его
logs=(имя_лог_файла1 имя_лог_файла2 имя_лог_файла3)
while :; do
for log in ${logs[@]}; do
if ((`date +%s` - `date +%s -r $log` > 20)); then
# перезапускаем ffmpeg
fi
done
sleep 5
done
Lexaz: тогда ассоциативный массив с соответствием имя_файла-команда
declare -A logs
logs[имя_лог_файла1]='echo echo1'
logs[имя_лог_файла2]='echo echo2'
logs[имя_лог_файла3]='echo echo3'
while :; do
for log in "${!logs[@]}"; do
if ((`date +%s` - `date +%s -r "$log"` > 20)); then
${logs[$log]} # выполняем команду
fi
done
sleep 5
done
xibir: вот тут у меня появилось недопонимание. Можно на примере?
ffmpeg1.log - лог первого процесса
ffmpef2.log - лог второго процесса
service nginx1 restart - рестарт 1 процесса (ffmpeg поднимается nginxом)
service nginx2 restart - рестарт 2 процесса
declare -A logs
logs[/var/log/ffmpeg1.log]='service nginx1 restart'
logs[/var/log/ffmpeg2.log]='service nginx2 restart'
while :; do
for log in "${!logs[@]}"; do
if ((`date +%s` - `date +%s -r "$log"` > 20)); then
${logs[$log]} # перезапускаем ffmpeg
fi
done
sleep 5
done
xibir, помоги со скриптом, предедущий твой прекрасно работает
Есть некоторое количество устройств, нужно отслеживать их выключение, тоесть если устройство недоступно уведомление по смс и на почту.
Устройств 10-20
Проверка каждого устройства каждые 2 минуты
При недоступности повтор проверки каждые 10 секунд, если через минуту устройство так же недоступно тогда уведомление и след проверка через 2 минуты
Повторные одинаковые уведомления не слать, как только устройство появилось в сети слать уведомление о доступности.
Сообщения вида: устройство1 недоступно/доступно *время*
проверять наверное лучше NMAPоп по порту
Lexaz, по смс как остылать не знаю, надо гуглить, по почте где-то так:
#!/bin/bash
devices=('host1' 'host2' 'host3')
declare -a states lastChecks
for((i = 0; i < ${#devices[@]}; ++i)); do
states[$i]='up'
lastChecks[$i]=0
done
export LANG=en_US.utf8
# надо сконфгурировать msmtp и прописать правильные аргументы, или использовать что-то другое
send() { echo -e "Subject: $1\n\ntest" | msmtp -a testaccount example@example.com; }
while :; do
for((i = 0; i < ${#devices[@]}; ++i)); do
time=`date +%s`
[ ${states[$i]} == 'up' ] && t=120 || t=10
if (( $time - ${lastChecks[$i]} >= $t )); then
lastCheck[$i]=$time
if nmap --host-timeout 1 -sn ${devices[$i]} | grep -qs 'is up'; then
if [ ${states[$i]} != 'up' ]; then
states[$i]='up'
send "host ${devices[$i]} is up"
fi
else
if [ ${states[$i]} == 'up' ]; then
states[$i]='down'
send "host ${devices[$i]} is down"
fi
fi
fi
done
sleep 10
done
xibir, я не вижу каким образом устройства будут проверяться. Предлагаю по ответу nmap host -p так как первое что приходит на ум, хотя тут подумал что у него и webserver на отдельном порту отвечает.