Acabo de notar el comentario sobre MacOS, y aunque creo que la solución de @akira (y pv) es mucho más ordenada, pensé en perseguir una corazonada y una solución rápida en mi caja de MacOS con alquitrán y enviarle una señal SIGINFO. Curiosamente, funcionó :) si está en un sistema similar a BSD, esto debería funcionar, pero en una caja de Linux, es posible que deba enviar un SIGUSR1, y / o tar
puede que no funcione de la misma manera.
El inconveniente es que solo le proporcionará una salida (en stdout) que le mostrará qué tan lejos está el archivo actual, ya que supongo que no tiene idea de cuán grande es el flujo de datos que está obteniendo.
Entonces, sí, un enfoque alternativo sería disparar alquitrán y enviarle periódicamente SIGINFO cada vez que desee saber qué tan lejos ha llegado. ¿Como hacer esto?
El enfoque manual ad-hoc
Si desea poder verificar el estado de forma ad-hoc, puede presionar control-T
(como mencionó Brian Swift) en la ventana correspondiente que enviará la señal SIGINFO. Un problema con eso es que lo enviará a toda su cadena, creo, así que si está haciendo:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
También verá que bzip2 informa su estado junto con 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)
Esto funciona bien si solo desea verificar si tar
está ejecutando está atascado, o simplemente lento. Probablemente no necesite preocuparse demasiado por los problemas de formato en este caso, ya que es solo una comprobación rápida.
El tipo de enfoque automatizado
Si sabe que tomará un tiempo, pero desea algo así como un indicador de progreso, una alternativa sería disparar su proceso de tar y en otro terminal resolver su PID y luego lanzarlo a un script que solo envía una señal repetidamente . Por ejemplo, si tiene el siguiente scriptlet (e invoque como se dice 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?"
Si lo invoca de esta manera, ya que solo está apuntando tar
, obtendrá un resultado más parecido a 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)
...
lo cual admito, es un poco bonito.
Por último, pero no menos importante: mi scripting está un poco oxidado, así que si alguien quiere entrar y limpiar / arreglar / mejorar el código, vaya por su vida :)