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 Terminated
mensagem.
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:
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.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.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.
Respostas:
Você pode colocar o comando timeout em uma subshell e torná-lo bem-sucedido:
fonte
(timeout 10 <command> || :) | wc -c
Logo após a postagem, pensei em usar pipes nomeados para o processo:
Isso parece funcionar.
fonte