Como medir o tempo que leva para executar meu script E incluir isso em um email gerado?

11

Eu tenho um script simples que executa uma série de verificações ( ping, nslookup, etc) e, em seguida, envia um relatório de e-mail com a saída desses dados.

Gostaria que o email incluísse informações sobre quanto tempo o script inteiro levou para ser executado. Existe uma maneira fácil de coletar essas informações?

Mike B
fonte

Respostas:

15

Sugiro dar uma olhada na bashvariável SECONDS:

SECONDS : Cada vez que esse parâmetro é referenciado, o número de segundos desde a chamada do shell é retornado. Se um valor for atribuído a SECONDS, o valor retornado nas referências subseqüentes será o número de segundos desde a atribuição mais o valor atribuído.

Assim, você pode simplesmente imprimir essa variável no final do script. Como alternativa, se sua intenção é medir o tempo de apenas parte do programa, basta definir SECONDS=0no início do bloco de comandos medido e, no final, apenas usar o valor armazenado nessa variável.

jimmij
fonte
Eu nunca soube $SECONDS; isso é ótimo! Para adicionar isso, você pode converter segundos em horas: minutos: segundos com algo parecido date -d "1970-01-01 ${SECONDS} sec" +'%k:%M:%S'(veja man datepara mais opções de formatação).
Sparhawk 08/02
Eu realmente gosto dessa abordagem, mas ainda estou um pouco confusa. Digamos que eu execute o mesmo script alguns segundos um do outro. Se eu definir SECONDS=0um script e a mesma coisa em outro script, eles interferirão um no outro?
Mike B
3
Deixa pra lá - eu me deparei com o feedback de Tom em uma publicação Stack Overflow ( stackoverflow.com/a/5153036/344780 ), que basicamente subtrai a diferença START_TIME=$SECONDS; dosomething; ELAPSED_TIME=$(($SECONDS - $START_TIME)). Isso parece um pouco mais flexível para uso simultâneo.
Mike B
8

Prefixe seu comando /usr/bin/timee o comando time exibirá o tempo que levou o script para ser executado. Isso é mais portátil do que usar algo bashespecífico.

Steve Wills
fonte
6

Enquanto estiver usando SECONDSe timefornecerá valores relativos. Se você deseja ter valores absolutos para fins de auditoria e relatório, quando o script foi executado e quando foi concluído, tente algo assim antes e depois dos comandos date '+%Y%m%d%H%M%S.%N'. Isso também pode fornecer uma granularidade melhor, pois pode capturar diferenças de segundos que você tem, como comandos pingque normalmente são executados em um segundo.

rahul
fonte
1

Aninhe seu script. Para enviar um email, há várias opções. Pessoalmente, sou a favor do msmtp, é possível definir os cabeçalhos no estilo "aqui" (em linha) ou usar um arquivo separado e agrupá-los. Existem todos os tipos de alternativas para isso envolvendo perl, python etc.

Reply-To: someone@somehost
Sender: someone <someone@somehost>
To: somebody@somewhere.else
Subject: some subject
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/html; charset="iso-8859-1"

A linha em branco à direita é importante. coloque sua mensagem montada no msmtp assim:

cat assembled.eml | msmtp somebody@somewhere.else

Um pessimista repetiria até o sucesso um número razoável de vezes.

A carga útil também pode ser html e pode ser gerada por php.

Uma alternativa muito feia para a operação "em lotes" da noite para o dia é criar um cronjob e a saída é enviada por email em vez de stdout / stderr.

mckenzm
fonte