Você pode colocar o comando timeout em um subshell e torná-lo bem-sucedido:
( timeout 10 <command> || true ) | wc -c
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:
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.
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.
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.
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.