operador Como redirecionar a saída do comando time para um arquivo no Linux?



find 2 dev null (9)

Apenas uma pequena pergunta sobre os programas de temporização no Linux: o comando time permite medir o tempo de execução de um programa:

[[email protected] ~]$ time sleep 1

real    0m1.004s
user    0m0.000s
sys     0m0.004s

Que funciona bem. Mas se eu tentar redirecionar a saída para um arquivo, ele falhará.

[[email protected] ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[[email protected] ~]$ cat time.txt 
[[email protected] ~]$ 

Eu sei que existem outras implementações de tempo com a opção -o para gravar um arquivo, mas a minha pergunta é sobre o comando sem essas opções.

Alguma sugestão ?


Answer #1

Simples. O utilitário de time GNU tem uma opção para isso.

Mas você tem que garantir que você não está usando o comando de time interno do seu shell, pelo menos o bash builtin não fornece essa opção! É por isso que você precisa fornecer o caminho completo do utilitário de time :

/usr/bin/time -o time.txt sleep 1

Answer #2

Acabei usando:

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
  • Onde "a" é anexado
  • Onde "o" é processado pelo nome do arquivo para anexar
  • Onde "f" é o formato com uma sintaxe semelhante a printf
  • Onde "% E" produz 0:00:00; horas: minutos: segundos
  • Eu tive que invocar / usr / bin / time porque o bash "time" estava atropelando e não tem as mesmas opções
  • Eu estava apenas tentando obter saída para arquivo, não a mesma coisa como OP

Answer #3

Se você se preocupa com a saída de erro do comando, pode separá-los desta forma enquanto ainda estiver usando o comando de tempo integrado.

{ time your_command 2> command.err ; } 2> time.log

ou

{ time your_command 2>1 ; } 2> time.log

Como você vê os erros do comando vão para um arquivo (já que o stderr é usado para o time ).

Infelizmente você não pode enviá-lo para outro identificador (como 3>&2 ), uma vez que não existirá mais fora do {...}

Dito isso, se você puder usar o tempo GNU, faça o que @Tim Ludwinski disse.

\time -o time.log command

Answer #4

Se você estiver usando csh você pode usar:

/usr/bin/time --output=outfile -p $SHELL  -c 'your command'

Por exemplo:

/usr/bin/time --output=outtime.txt -p csh -c 'cat file'

Answer #5

Experimentar

{ time sleep 1 ; } 2> time.txt

que combina o STDERR de "time" e seu comando em time.txt

Ou use

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

que coloca STDERR de "sleep" no arquivo "sleep.stderr" e somente STDERR de "time" entra em "time.txt"


Answer #6

Se você não quiser tocar no processo original 'stdout e stderr, você pode redirecionar o stderr para o descritor de arquivo 3 e voltar:

$ { time { perl -le "print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out

real    0m0.009s
user    0m0.004s
sys     0m0.000s

Você poderia usar isso para um wrapper (por exemplo, para o cronjobs) para monitorar tempos de execução:

#!/bin/bash

echo "[$(date)]" "[email protected]" >> /my/runtime.log

{ time { "[email protected]" 2>&3; }; } 3>&2 2>> /my/runtime.log

Answer #7
#!/bin/bash

set -e

_onexit() {
    [[ $TMPD ]] && rm -rf "$TMPD"
}

TMPD="$(mktemp -d)"
trap _onexit EXIT

_time_2() {
    "[email protected]" 2>&3
}

_time_1() {
    time _time_2 "[email protected]"
}

_time() {
    declare time_label="$1"
    shift
    exec 3>&2
    _time_1 "[email protected]" 2>"$TMPD/timing.$time_label"
    echo "time[$time_label]"
    cat "$TMPD/timing.$time_label"
}

_time a _do_something
_time b _do_another_thing
_time c _finish_up

Isso tem o benefício de não gerar sub shells, e o pipeline final tem stderr restaurado para o stderr real.


Answer #8

Se você estiver usando o tempo GNU em vez do bash embutido, tente

time -o outfile command

(Nota: os formatos de hora do GNU são um pouco diferentes do que o bash embutido).


Answer #9
&>out time command >/dev/null

no seu caso

&>out time sleep 1 >/dev/null

então

cat out




time