Функция Shell для привязки файла журнала к определенной строке в течение определенного времени
Мне нужно следующее: убедитесь, что мой сервер приложений
- Хвост файла журнала для определенной строки
- Остаться заблокированным до тех пор, пока эта строка не будет напечатана
- Однако, если строка не печатается в течение примерно 20 минут, выходим и высылаем сообщение об исключении, такое как "Сервер занимает больше 20 минут, чтобы быть в порядке"
- Если строка напечатана в файле журнала, закройте цикл и продолжайте.
Есть ли способ включить тайм-ауты в цикл while?
Ответы
Ответ 1
#!/bin/bash
tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var
[ $? -eq 0 ] && echo 'ok' || echo 'server not up'
Это считывает все, что записано в файл журнала, ищет определенное_слово, echos ok, если все хорошо, иначе после ожидания 1200 секунд (20 минут) он жалуется.
Ответ 2
Вы можете сделать это следующим образом:
start_time=$(date +"%s")
while true
do
elapsed_time=$(($(date +"%s") - $start_time))
if [[ "$elapsed_time" -gt 1200 ]]; then
break
fi
sleep 1
if [[ $(grep -c "specific string" /path/to/log/file.log) -ge 1 ]]; then
break
fi
done
Ответ 3
Вы можете использовать обработчики сигналов из сценариев оболочки (см. http://www.ibm.com/developerworks/aix/library/au-usingtraps/index.html).
В принципе, вы должны определить функцию, вызываемую, скажем, сигналом 17, затем поместить суб- script в фоновом режиме, который пошлет этот сигнал через некоторое время:
timeout(pid) {
sleep 1200
kill -SIGUSR1 $pid
}
watch_for_input() {
tail -f file | grep item
}
trap 'echo "Not found"; exit' SIGUSR1
timeout($$) &
watch_for_input
Затем, если вы достигнете 1200 секунд, вы вызываете свою функцию, и вы можете выбрать, что делать (например, сигнализировать комбинацию tail/grep, которая следит за вашим шаблоном, чтобы убить его).
Ответ 4
time=0
found=0
while [ $time -lt 1200 ]; do
out=$(tail logfile)
if [[ $out =~ specificString ]]; then
found=1
break;
fi
let time++
sleep 1
done
echo $found
Ответ 5
Принятый ответ не работает и никогда не выйдет (поскольку althouth read -t
завершает работу, команды предыдущего канала (tail -f | grep
) будут уведомлены только о read -t
, когда они пытаются записать на вывод, что никогда происходит до тех пор, пока строка не будет соответствовать).
Один лайнер, вероятно, возможен, но здесь используются сценарии (рабочие).
Логика одинакова для каждого из них, они используют kill
для завершения текущего script после таймаута.
Perl, вероятно, более широко доступен, чем gawk/read -t
#!/bin/bash
FILE="$1"
MATCH="$2"
# Uses read -t, kill after timeout
#tail -f "$F" | grep "$MATCH" | (read -t 1 a ; kill $$)
# Uses gawk read timeout ability (not available in awk)
#tail -f "$F" | grep "$MATCH" | gawk "BEGIN {PROCINFO[\"/dev/stdin\", \"READ_TIMEOUT\"] = 1000;getline < \"/dev/stdin\"; system(\"kill $$\")}"
# Uses perl & alarm signal
#tail -f "$F" | grep "$MATCH" | perl -e "\$SIG{ALRM} = sub { `kill $$`;exit; };alarm(1);<>;"