Функция Shell для привязки файла журнала к определенной строке в течение определенного времени - программирование
Подтвердить что ты не робот

Функция Shell для привязки файла журнала к определенной строке в течение определенного времени

Мне нужно следующее: убедитесь, что мой сервер приложений

  • Хвост файла журнала для определенной строки
  • Остаться заблокированным до тех пор, пока эта строка не будет напечатана
  • Однако, если строка не печатается в течение примерно 20 минут, выходим и высылаем сообщение об исключении, такое как "Сервер занимает больше 20 минут, чтобы быть в порядке"
  • Если строка напечатана в файле журнала, закройте цикл и продолжайте.

Есть ли способ включить тайм-ауты в цикл while?

4b9b3361

Ответ 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);<>;"