Acabei de notar o comentário sobre o MacOS e, embora eu ache a solução do @akira (e pv) muito mais elegante, pensei em seguir um palpite e uma rápida solução alternativa na minha caixa do MacOS com tar e enviar um sinal SIGINFO. Curiosamente, funcionou :) se você estiver em um sistema BSD-like, este deve funcionar, mas em uma caixa de Linux, talvez seja necessário enviar um SIGUSR1, e / ou tar
pode não funcionar da mesma maneira.
O lado negativo é que ele apenas fornecerá uma saída (no stdout) mostrando a você o quão longe está o arquivo atual, pois acho que não tem idéia do tamanho do fluxo de dados.
Portanto, sim, uma abordagem alternativa seria ativar o alcatrão e enviá-lo periodicamente a SIGINFOs sempre que você quiser saber até que ponto chegou. Como fazer isso?
A abordagem manual ad-hoc
Se você quiser verificar o status de maneira ad-hoc, poderá clicar control-T
(como Brian Swift mencionou) na janela relevante que enviará o sinal SIGINFO. Um problema é que ele será enviado para toda a cadeia, acredito que, se você estiver fazendo:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Você também verá o relatório bzip2, seu status e 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 tar
está executando ou está travado ou lento. Você provavelmente não precisa se preocupar muito com problemas de formatação neste caso, pois é apenas uma verificação rápida.
O tipo de abordagem automatizada
Se você sabe que vai demorar um pouco, mas quer algo como um indicador de progresso, uma alternativa seria disparar seu processo de tar e, em outro terminal, calcular o PID e jogá-lo em um script que apenas envia repetidamente um sinal . Por exemplo, se você tiver o seguinte scriptlet (e invoque-o 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ê invocá-lo dessa maneira, como você está segmentando apenas, tar
obterá uma saída mais parecida com 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)
...
o que eu admito, é meio bonito.
Por último, mas não menos importante - meus scripts estão meio enferrujados; portanto, se alguém quiser entrar e limpar / consertar / melhorar o código, continue sua vida :)