Eu quero medir o tempo entre dois trabalhos em um arquivo de log

0

Eu tenho um arquivo de log cujo nome / diretório é: /srv/uni/kani/LogDay.09-03-2016 O nome do logfile muda de data todos os dias. Então, amanhã será: 'LogDay.10-03-2016' e assim por diante ...

Gostaria de ajudar a criar um script que examine esse arquivo e encontre essa linha:

08-03-2016 19:00:01 b5121 DISPLAY ID(IP[RANDOMIPADRESS] PID[22003]) MSG[BEGIN JOB /srv/uni/PROD/PNRUN/PN4949D

e mede o tempo em minutos até que esse trabalho seja gravado no log:

08-03-2016 19:19:17 b7285 DISPLAY ID(IP[RANDOMIPADRESS] JOB[FO1008] PID[28085]) MSG[END JOB /srv/uni/PROD/PNRUN/FO1008D, , 27392]

Há um monte de outras linhas no log .. com outros trabalhos dizendo BEGIN job e END job e assim por diante. Mas esses dois específicos eu quero medir o tempo entre.

Eu gostaria de usar este roteiro no final da noite para ver quanto tempo todos os trabalhos levaram totalmente. Em vez de ter que ir no log e contar manualmente ...

E eu quero colocá-lo em um script bash:)

Eu gostaria que a saída dissesse algo como. O trabalho de Tonights durou totalmente X horas X minutos.

Alguém pode me ajudar com isso?

    
por David 09.03.2016 / 16:05

1 resposta

0

 #!/bin/bash

    myDate=$(date +'%d-%m-%Y')
    logPath='/srv/uni/kani/catalog/'
    BEGINJOB="PN4949D" # Can set to $1 to accept as 1st arg
    ENDJOB="FO1008D" # Can set to $2 to accept as 2nd arg
    regexFirst="$myDate.*BEGIN JOB /srv/uni/PROD/PNRUN/$BEGINJOB"
    regexLast="$myDate.*END JOB /srv/uni/PROD/PNRUN/$ENDJOB"
    # Find First time 
    FIRST=$(sed -n "/$regexFirst/p" $logPathLogDay.$myDate  | head -1)
    FIRST=$(echo $FIRST | sed -n 's/.*\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\).*//p')
    echo "First job started at $FIRST"

    # Find Last time
    LAST=$(sed -n "/$regexLast/p" $logPathLogDay.$myDate | tail -1)
    LAST=$(echo $LAST | sed -n 's/.*\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\).*//p')
    echo "Last job ended at $LAST"
    #Compare time
    # feeding variables by using read and splitting with IFS
    IFS=: read first_hour first_min first_sec <<< "$FIRST"
    IFS=: read last_hour last_min last_sec <<< "$LAST"

    # 
    # the 10# is there to avoid errors with leading zeros
    # by telling bash that we use base 10
    total_hours=$((10#$last_hour - 10#$first_hour))
    total_minutes=$((10#$last_min - 10#$first_min))
    total_secs=$((10#$last_sec - 10#$first_sec))

    echo "Tonight's work took $total_hours hours $total_minutes minutes and $total_secs seconds"

Este script analisará a data atual e procurará pelo arquivo de datas, a primeira ocorrência de BEGIN e a última ocorrência de END e, em seguida, comparará as marcações de hora.

Saída como:

First job started at 19:00:01

Last job ended at 24:00:01

Tonight's work took 5 hours 0 minutes and 0 seconds

Este é um script rápido que eu joguei junto, você pode limpá-lo e modificar a saída, jogá-lo em uma função, se necessário, etc.

* EDIT: Além disso, para executar este script, basta adicionar ao seu crontab para ser executado diariamente no horário que preferir.

** EDIT: eu adicionei as variáveis para o início e fim do regex.

Eu transformei o que parece ser o Job Reference # como variáveis, para que você possa alterá-lo facilmente ou até mesmo passá-lo como argumento.

Por fim, coloco o caminho para o log como uma variável, de modo que possa ser alterado facilmente também.

Como observação, adicionei os comentários no script, embora não sejam os mais detalhados, mas eles estão lá para que você possa seguir o script e fazer alterações para atender às suas necessidades. Como acontece com qualquer script, a personalização pode ser infinita!

Você também pode modificar a data como: myDate=$(date --date="1 day ago" +'%d-%m-%Y') , se preferir ter essa aparência nos registros do dia anterior.

    
por 09.03.2016 / 21:37