Só notei o comentário sobre o MacOS, e embora eu ache que a solução de @akira (e pv) é muito mais simples, pensei em perseguir um palpite e uma rápida brincadeira na minha caixa MacOS com tar e enviando um sinal SIGINFO. Curiosamente, funcionou :) se você está em um sistema parecido com o BSD, isso deve funcionar, mas em uma caixa do Linux, você pode precisar enviar um SIGUSR1, e / ou tar
pode não funciona da mesma maneira.
O lado negativo é que ele fornecerá apenas uma saída (no stdout) mostrando a que distância do arquivo atual ele está, já que acredito que não tenha idéia do tamanho do fluxo de dados que está obtendo.
Então, sim, uma abordagem alternativa seria ativar o tar e periodicamente enviá-lo SIGINFOs a qualquer momento que você quiser saber até onde ele chegou. Como fazer isso?
A abordagem manual ad-hoc
Se você quiser verificar o status em uma base ad-hoc, pode acessar control-T
(como Brian Swift mencionou) na janela relevante que enviará o sinal SIGINFO. Um problema com isso é que ele irá enviá-lo para toda a sua cadeia, creio, então se você estiver fazendo:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Você também verá o bzip2 informando seu status junto com o tar:
a folder-with-big-files/big-file.imgload 0.79 cmd: bzip2 13325 running
14 0.27u 1.02s
adding folder-with-big-files/big-file.imgload (17760256 / 32311520)
Isso funciona muito bem se você quiser apenas verificar se o tar
em execução está parado ou apenas lento. Você provavelmente não precisa se preocupar muito com problemas de formatação neste caso, já que é apenas uma verificação rápida.
O tipo de abordagem automatizada
Se você sabe que vai demorar um pouco, mas quer algo parecido com um indicador de progresso, uma alternativa seria disparar seu processo de tar e em outro terminal trabalhar com o PID e depois lançá-lo em um script que envia repetidamente um sinal acabou. Por exemplo, se você tiver o seguinte scriptlet (e invocá-lo como diz script.sh PID-to-signal interval-to-signal-at
):
#!/bin/sh
PID=$1
INTERVAL=$2
SIGNAL=29 # excuse the voodoo, bash gets the translation of SIGINFO,
# sh won't..
kill -0 $PID # invoke a quick check to see if the PID is present AND that
# you can access it..
echo "this process is $$, sending signal $SIGNAL to $PID every $INTERVAL s"
while [ $? -eq 0 ]; do
sleep $INTERVAL;
kill -$SIGNAL $PID; # The kill signalling must be the last statement
# or else the $? conditional test won't work
done
echo "PID $PID no longer accessible, tar finished?"
Se você invocar dessa maneira, já que você está segmentando apenas tar
, você obterá uma saída como esta
a folder-with-big-files/tinyfile.1
a folder-with-big-files/tinyfile.2
a folder-with-big-files/tinyfile.3
a folder-with-big-files/bigfile.1
adding folder-with-big-files/bigfile.1 (124612 / 94377241)
adding folder-with-big-files/bigfile.1 (723612 / 94377241)
...
que eu admito, é meio bonito.
Por último, mas não menos importante - meu script está meio enferrujado, então se alguém quiser entrar e limpar / corrigir / melhorar o código, vá para a sua vida:)