Tempo de execução dos comandos de log

6

Gostaria de registrar o tempo de execução dos meus comandos. Algo parecido com isto:

#!/usr/bin/env bash
echo "$@" >> /tmp/times
exec 3>&2
(/usr/bin/time -f "%e" "$@" 2>&3) 2>>/tmp/times

O problema é que o tempo gera processo filho que poluiu o erro padrão. Isso pode ser feito sem esse efeito colateral?

    
por sevo 22.10.2017 / 22:29

1 resposta

8

Se você usar /usr/bin/time , a única maneira de enviar o stderr do processo cronometrado e as informações de tempo para diferentes canais é informar ao utilitário time para fazê-lo. Você não pode fazê-lo com redirecionamentos no shell que chama time porque o stderr do processo cronometrado e a saída de time em si são enviados para o mesmo descritor de arquivo.

O utilitário time que você está usando (com base no seu uso de -f , é GNU coreutils) tem uma opção -o para dizer a ele para gravar em um arquivo diferente e -a para anexar a este ficheiro. Esta opção também existe no FreeBSD e no macOS.

#!/bin/sh
echo "$@" >>/tmp/times
exec time -f %e -a -o /tmp/times -- "$@"

Como alternativa, você pode usar a palavra-chave shell (em shells que a possuem, que inclui bash, ksh e zsh). Com a palavra-chave, você pode controlar onde as informações de tempo passam pelo redirecionamento, porque você pode especificar um redirecionamento como parte do processo cronometrado.

#!/bin/bash
echo "$@" >>/tmp/times
TIMEFORMAT='%R'
{ time "$@" 2>&3; } 3>&2 2>>/tmp/times
    
por 22.10.2017 / 23:09