timeout, quebra de tubos e wc


20

Tive a ideia de avaliar rapidamente alguns programas de descompressão. Por exemplo, para gz, eu executaria o comando:

timeout 10 zcat foo.gz | wc -c

O que mede a quantidade de dados que o descompactador pode extrair em 10 segundos.

O único problema é que ele não funciona: como o zcat é morto, o wc também é morto, então não recebo a contagem de bytes, apenas uma Terminatedmensagem.

Portanto, a questão é: existe uma maneira de obter a contagem de wc , bloqueando o sinal de alguma forma, ou use uma alternativa em vez de wc que imprima um resultado mesmo quando recebe um sinal de termo.


Claro, existem alternativas:

  1. Gravando 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 disso é que consome muita memória e também pode ter alguma penalidade de desempenho.

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

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


6
Enquanto eu lia "quebrando canos e vaso sanitário", pensei que a princípio você estava tendo problemas com seu encanamento!
dr01 23/09/2015

Respostas:


21

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

( timeout 10 <command> || true ) | wc -c

3
Fazendo um comando com falha ter sucesso? Ah, isso parece tão ruim: D
Erathiel 23/09/2015

17
@Erathiel Quer sorrir enquanto é mau? Tente este (é equivalente ao acima):(timeout 10 <command> || :) | wc -c
Marco

11
Tentei usar um subshell, mas não pensei em torná-lo bem-sucedido. Excelente!
P.Péter 23/09/15

2

Logo após a postagem, 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.