Bash: как сделать последний файл в непрерывном цикле - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь написать скрипт, который следит за файлом журнала и при определенной ошибке выполняет определенную функцию.Я получил основной код работает, однако застрял с одной проблемой.Приложение создает новый файл журнала при изменении системной даты (шаблон имени файла журнала - LOG.NODE1.DDMMYYYY), как мне заставить мой код автоматически переключаться на новый файл, который создается.Ниже приведен мой сценарий,

#!/bin/sh

logfile=$(ls -t $DIR"/env/log/LOG"* | head -n 1)
echo $logfile
tail -f $logfile | while read LOGLINE
do

if [[  "${LOGLINE}" == *";A database exception has occurred: FATAL DBERR:  SQL_ERROR: ORA-00001: unique constraint (IX_TEST1) violated"* ]];

then
        #Do something

fi
done

1 Ответ

0 голосов
/ 02 октября 2018
#!/bin/bash
#      ^^^^ -- **NOT** /bin/sh

substring=";A database exception has occurred: FATAL DBERR:  SQL_ERROR: ORA-00001: unique constraint (IX_TEST1) violated"
newest=
timeout=10  # number of seconds of no input after which to look for a newer file

# sets a global shell variable called "newest" when run
# to keep overhead down, this avoids invoking any external commands
find_newest() {
  set -- "${DIR?The variable DIR is required}"/env/log/LOG*
  [[ -e $1 || -L $1 ]] || return 1
  newest=$1; shift
  while (( $# )); do
    [[ $1 -nt $newest ]] && newest=$1
    shift
  done
}

while :; do
  find_newest  # check for newer files
  # if the newest file isn't the one we're already following...
  if [[ $tailing_from_file != "$newest" ]]; then
    exec < <(tail -f -- "$newest")  # start a new copy of tail following the newer one
    tailing_from_file=$newest       # and record that file's name
  fi
  if read -t "$timeout" -r line && [[ $line = *"$substring"* ]]; then
    echo "Do something here"
  fi
done
...