Acabei de reparar no comentário sobre MacOS, e enquanto penso que a solução de @akira (e pv) é much neater, pensei em perseguir um palpite e uma brincadeira rápida na minha caixa MacOS com alcatrão e enviar-lhe um sinal SIGINFO. Curiosamente, funcionou :) se estiver num sistema tipo BSD, este deve funcionar, mas numa caixa Linux, pode precisar de enviar um SIGUSR1, e/ou tar
pode não funcionar da mesma maneira.
O lado negativo é que apenas lhe fornecerá uma saída (em stdout) que lhe mostrará até que ponto o ficheiro actual está, uma vez que suponho que não faz ideia do tamanho do fluxo de dados que está a receber.
Por isso, sim, uma abordagem alternativa seria disparar alcatrão e enviar-lhe SIGINFOS periodicamente sempre que quiser saber até onde chegou. Como fazer isto?
A abordagem ad-hoc, manual
Se quiser poder verificar o estado numa base ad-hoc, pode carregar em control-T
(como Brian Swift mencionou) na janela relevante que enviará o sinal SIGINFO através. Um problema com isso é que o enviará para toda a sua cadeia, creio eu, portanto, se o fizer:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Verá também o bzip2 reportar o seu estado juntamente com o alcatrão:
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)
Isto funciona bem se quiser apenas verificar se o tar
que está a correr está emperrado, ou apenas lento. Provavelmente não precisa de se preocupar muito com questões de formatação neste caso, uma vez que é apenas uma verificação rápida…
O tipo de abordagem automatizada
Se sabe que vai demorar algum tempo, mas quer algo como um indicador de progresso, uma alternativa seria disparar o seu processo de alcatrão e noutro trabalho terminal é o PID e depois atirá-lo para um script que apenas envia repetidamente um sinal. Por exemplo, se tiver o seguinte scriptlet (e invocá-lo como digamos 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 o invocar desta forma, uma vez que tem como alvo apenas tar
obterá um resultado mais parecido com este
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)
...
o que admito, é um pouco bonito.
Por último mas não menos importante - a minha escrita está um pouco enferrujada, por isso se alguém quiser entrar e limpar/fixar/imprimir o código, vá pela sua vida :)