timeout, rompendo canos e wc

20

Eu tive uma ideia para avaliar rapidamente alguns programas de descompressão. Por exemplo. para gz, eu rodaria o comando:

timeout 10 zcat foo.gz | wc -c

Que mede a quantidade de dados que o descompressor pode extrair em 10 segundos.

O único problema é que ele não funciona: como o zcat é eliminado, o wc também é eliminado, então eu não obtenho a contagem de bytes, apenas uma mensagem Terminated .

Então, a questão é: existe uma forma de obter a contagem de wc , bloqueando o sinal de alguma forma ou usando uma alternativa em vez de wc que imprime um resultado mesmo quando ele recebe um sinal de termo.

Claro, existem alternativas:

  1. Escrevendo em um arquivo temporário:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x O problema com isso é que ele usa muita memória e também pode ter alguma penalidade de desempenho.

  2. Usando ulimit em vez disso:
    ulimit -t 10; zcat foo.gz | wc -c
    Isso também funciona, mas mede apenas o tempo de CPU, portanto, a lentidão devido a E / S (por exemplo, porque a compactação é pior e mais bytes precisam ser lidos do disco) não é medida.

  3. Fazendo pequenos arquivos de teste:
    Bem, isso pode funcionar, claro, e pode ser a melhor solução. No entanto, isso cria muitos arquivos temporários.

por P.Péter 23.09.2015 / 12:42

2 respostas

22

Você pode colocar o comando timeout em um subshell e torná-lo bem-sucedido:

( timeout 10 <command> || true ) | wc -c
    
por 23.09.2015 / 12:48
2

Logo após postar, pensei em usar pipes nomeados para o processo:

mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &

Isso parece funcionar.

    
por 23.09.2015 / 13:06

Tags