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

Я не могу найти, как правильно структурировать цикл while для записи в текстовый файл всех сбоев данного приложения Linux. Я хотел бы получить подсказку, чтобы я мог ввести имя приложения, а затем цикл для просмотра pid приложения. Если pid - ноль, я хотел записать метку времени в текстовый файл и продолжить цикл. Если на второй итерации все еще находится в нуле, ничего не регистрируйте, продолжайте мониторинг, пока не возникнут другие сбои и другие журналы ... и так далее, пока сценарий не остановится с помощью CTRL + C.

Я попробовал несколько вариантов этого сценария без удачи. Я думаю, что мне нужны советы о том, как придумать «петлевую структуру» для достижения любых целей ...

read -p "What is the name of the application you want to monitor?" appname

pidofapp=`ps -elf | grep "$appname" | grep -v grep | awk '{print $4}'`
pidofappcheck=`ps -elf | grep "$appname" | grep -v grep | awk '{print $4}'`

while :
do
if [[ ! -z "$pidofappcheck" ]] ; then
        pidwasnull=true
pidofappcheck=`ps -elf | grep "$appname" | grep -v grep | awk '{print $4}'`
if [[ "$pidofapp" == "$pidofappcheck" ]] ; then
        printf "Still monitoring...\n"
        sleep 5
elif [[ "$pidwasnull" == true ]] ; then
        continue
fi
        echo "FAILURE: Crash occurred at: "$(date)" - Crashes will be logged in the monitoring tool directory under results.txt"
        date >> ./results.txt
fi
done

Как сейчас, сценарий выдаст эхо:

What is the name of the application you want to monitor?running Still monitoring... FAILURE: Crash occurred at: Wed May 22 01:44:53 EDT 2019 - Crashes will be logged in the monitoring tool directory under results.txt Still monitoring... FAILURE: Crash occurred at: Wed May 22 01:44:58 EDT 2019 - Crashes will be logged in the monitoring tool directory under results.txt

Заранее спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Так что мне удалось найти решение на основе того, что написал @Walter A.Вот что я использовал.Пока он работает, как и ожидалось.

#!/bin/bash

read -rp "What is the name of the application you want to monitor?" appname
app_pid=$(pidof "$appname")

#echo "First PID of "$appname" is "$app_pid""

while : ; do
   lastpid=$(pidof "$appname")
   if [[ "${app_pid}" == "${lastpid}" ]] ; then
        printf "Still monitoring...\n"
   else
      crashtxt="Crashes will be logged in the monitoring tool directory under results.txt"
      echo "FAILURE: Crash occurred at: $(date) ${crashtxt}"
      date >> ./results.txt
      app_pid="$lastpid"
   fi
   sleep 5
done

Так что этот скрипт будет в основном проверять PID данного приложения, пока вы не нажмете CTRL + C.Если PID приложения изменяется во время работы скрипта.Он выведет метки времени, когда это произошло, в файле «results.txt» и будет проверять его, пока вы не нажмете CTRL + C.Поэтому я собираюсь использовать это, чтобы регистрировать все случаи сбоя моих приложений.Большое спасибо @Walter A

0 голосов
/ 23 мая 2019

Попробуйте что-то вроде этого

#!/bin/bash
getpidofapp() {
   # pid=$(ps -elf | grep "$1" | grep -v grep | awk '{print $4}' | head -1)
   pid=$(pgrep "$1" | head -1)
   test -n "${pid}" || { echo "Is ${appname} running?"; exit 1; } 
}

read -rp "What is the name of the application you want to monitor?" appname
app_pid=$(getpidofapp "${appname}")

while : ; do
   lastpid=$(getpidofapp "${appname}")
   if [[ "${app_pid}" == "${lastpid}" ]] ; then
        printf "Still monitoring...\n"
   else
      crashtxt="Crashes will be logged in the monitoring tool directory under results.txt"
      echo "FAILURE: Crash occurred at: $(date) ${crashtxt}"
      date >> ./results.txt
   fi
   sleep 5
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...