Como obtenho os timestamps de início e término de um comando?

1

Eu tenho uma ferramenta que gera saídas padrão de tempos em tempos, sem perda de generalidade, digamos que a sequência seja:

mysystem$ ./runme
Starting
Done
mysystem$

Agora, 'runme' demora um pouco para ser concluído, então eu realmente gostaria de ter o shell para me dar

mysystem$ somecommand ./runme
0952 Starting
1134 Done
mysystem$

Ou alguma aproximação disso ... alguma ideia? Ficaria feliz com coisas como escrever no arquivo e assim por diante ...

EDIT adora a resposta rápida até agora, mas eu deveria ter sido mais claro ...

Pode haver declarações intermediárias feitas pelo programa, então eu realmente gostaria de ter o shell para me dar

mysystem$ somecommand ./runme
0952 Starting
0959 Somewaythough
1011 Mostly done
1134 Done
mysystem$

Mas isso pode ser impossível ...

    
por Joe 10.11.2011 / 10:54

4 respostas

2

Atual

$ ./slow
Starting ...
Nearly finished ...
All done.

Desejado

$./slow | ./stamp
15:31:19 Starting ...
15:31:29 Nearly finished ...
15:31:31 All done.

Prog lento

$ cat slow
#!/usr/bin/ksh
echo Starting ...
sleep 10
echo Nearly finished ...
sleep 2
echo All done.

Timestamper

$ cat stamp
#!/usr/bin/perl
use strict;
use warnings;
while(<>) {
  my($sec, $min, $hour) = (localtime)[0..2];
  print "$hour:$min:$sec $_";
}

Na verdade, estou surpreso que isso funcione, eu pensei que teria que fazer algo sobre buffering. YMMV

Usando sprintf para formatar, o tempo é deixado como um exercício para o leitor.

Para golfistas

$ ./slow | perl -n -e 'printf "%02d:%02d:%02d %s", (localtime)[2,1,0],$_'
15:42:17 Starting ...
15:42:27 Nearly finished ...
15:42:29 All done.
    
por 10.11.2011 / 16:34
2

Você pode colocar time na frente do comando para executar e irá cronometrar a execução.

user@hostname/pwd$ time ls
file1
file2
file3

real      0m0.006s
user      0m0.001s
sys       0m0.003s

Comandos mais longos criam timings mais interessantes.

    
por 10.11.2011 / 11:22
0

E sobre:

ls -la 
total 28
drwxr-xr-x   2 glens glens    27 2011-06-16 09:27 ./
drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
-rwxrwxrwx   1 glens glens   406 2011-06-16 09:27 SERVER_LOG.txt*

e com sed

ls -la  | sed -e "s/\(.*\)/$(date +%H%M) /"
1154 total 28
1154 drwxr-xr-x   2 glens glens    27 2011-06-16 09:27 ./
1154 drwxr-xr-x 197 glens glens 69632 2011-11-10 11:17 ../
1154 -rwxrwxrwx   1 glens glens   406 2011-06-16 09:27 SERVER_LOG.txt*
    
por 10.11.2011 / 17:54
0

Em bash , você pode combinar uma DEBUG trap e PROMPT_COMMAND para imprimir a hora diretamente antes e depois de executar um comando.

trap 'echo $( date )' DEBUG
PROMPT_COMMAND='echo $( date )'

Assim é como parece (a segunda saída é repetida, pois PROMPT_COMMAND é um comando interceptável:

$ sleep 5
Do 10 Nov 2011 18:10:36 CET
Do 10 Nov 2011 18:10:41 CET
Do 10 Nov 2011 18:10:41 CET
    
por 10.11.2011 / 18:11