Сценарий оболочки, который постоянно проверяет текстовый файл на наличие данных журнала, а затем запускает программу - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть Java-программа, которая часто останавливается из-за ошибок, которые регистрируются в файле .log.Что может быть простым сценарием оболочки, чтобы обнаружить определенный текст в последней / последней строке, скажем

[INFO] Stream closed

, а затем выполнить следующую команду

java -jar xyz.jar

Это должно продолжаться вечно (возможно, через каждые две минуты или около того), поскольку xyz.jar записывает файл журнала.

Текст stream closed может много раз попадать в файл журнала.Я просто хочу, чтобы он предпринял какие-то действия, когда он окажется в последней строке.

Ответы [ 5 ]

1 голос
/ 25 июля 2014

Может существовать условие, когда хвостовой последний журнал «Поток закрыт» не является реальным последним журналом, и процесс все еще регистрирует сообщения. Мы можем избежать этого условия, проверив, является ли процесс живым или нет. Если процесс завершился и последний журнал «Поток закрыт», то нам нужно перезапустить приложение.

#!/bin/bash

java -jar xyz.jar &
PID=$1

while [ true ]
do
   tail -1 logfile | grep -q "Stream Closed" && kill -0 $PID && sleep 20 && continue
   java -jar xyz.jar &
   PID=$1
done
1 голос
/ 29 сентября 2011

Как насчет

while [[ true ]];
do
  sleep 120
  tail -1 logfile | grep -q "[INFO] Stream Closed"
  if [[ $? -eq 1 ]]
  then
    java -jar xyz.jar &
  fi
done
0 голосов
/ 25 июля 2014

Хороший способ - использовать команду awk:

tail -f somelog.log | awk '/.*[INFO] Stream Closed.*/ { system("java -jar xyz.jar") }'

Это непрерывно контролирует поток журнала, и когда регулярное выражение совпадает, оно запускает любую системную команду, которую вы установили, что вы можете набрать.в оболочку.

Если вы действительно хотите быть хорошим, вы можете поместить эту строку в файл .sh и запустить этот файл .sh из демона мониторинга процессов, такого как upstart, чтобы убедиться, что он никогда не умрет.

красиво и чисто = D

0 голосов
/ 08 февраля 2013

Я решил это с помощью сторожевого скрипта, который напрямую (grep) проверяет, запущена (ли) программа (ы). вызывая watchdog каждую минуту (из cron под Ubuntu), я в основном гарантирую (программы и среда ОЧЕНЬ стабильны), что ни одна из программ не будет оставаться в автономном режиме более 59 секунд.

этот скрипт проверит список программ, использующих имя в массиве, и проверит, запущена ли каждая из них, и, если нет, запустит его.

#!/bin/bash
#
# watchdog
#
# Run as a cron job to keep an eye on what_to_monitor which should always
# be running. Restart what_to_monitor and send notification as needed.
#
# This needs to be run as root or a user that can start system services.
#
# Revisions: 0.1 (20100506), 0.2 (20100507)

# first prog to check
NAME[0]=soc_gt2
# 2nd
NAME[1]=soc_gt0
# 3rd, etc etc
NAME[2]=soc_gp00


# START=/usr/sbin/$NAME
NOTIFY=you@gmail.com
NOTIFYCC=you2@mail.com
GREP=/bin/grep
PS=/bin/ps
NOP=/bin/true
DATE=/bin/date
MAIL=/bin/mail
RM=/bin/rm


for nameTemp in "${NAME[@]}"; do
    $PS -ef|$GREP -v grep|$GREP $nameTemp >/dev/null 2>&1
    case "$?" in
    0)
        # It is running in this case so we do nothing.
        echo "$nameTemp is RUNNING OK. Relax."

        $NOP
        ;;
    1)
        echo "$nameTemp is NOT RUNNING. Starting $nameTemp and sending notices."
        START=/usr/sbin/$nameTemp 
        $START 2>&1 >/dev/null &
        NOTICE=/tmp/watchdog.txt
        echo "$NAME was not running and was started on `$DATE`" > $NOTICE
        # $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
        $RM -f $NOTICE
        ;;
    esac
done

exit

Я не использую проверку журнала, хотя вы можете легко включить ее в свою собственную версию (например, просто измените grep для проверки журнала).

если вы запустите его из командной строки (или замазки, если вы подключены удаленно), вы увидите, что работало, а что нет. использовал его в течение нескольких месяцев без икоты. просто вызывайте его всякий раз, когда хотите посмотреть, что работает (независимо от того, работает ли он под cron).

Вы также можете поместить все критически важные программы в одну папку, составить список каталогов и проверить, есть ли в каждом файле в этой папке программа, работающая под тем же именем. или прочитайте текстовый файл построчно, каждая строка соответствует программе, которая должна быть запущена. etcetcetc

0 голосов
/ 29 сентября 2011

Я бы предпочел проверить, запущен ли соответствующий процесс, и перезапустить программу для этого события. Могут быть и другие ошибки, которые вызывают остановку процесса. Вы можете использовать cronjob, чтобы периодически (как и каждую минуту) выполнять такую ​​проверку.

Кроме того, вы можете улучшить свой Java-код, чтобы он не зависал так часто (если у вас есть доступ к коду).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...