Acabo de notar el comentario sobre MacOS, y aunque creo que la solución de @akira (y pv) es mucho más limpia, pensé en perseguir una corazonada y un rápido juego en mi caja MacOS con tar y enviando una señal SIGINFO. Curiosamente, funcionó :) si estás en un sistema tipo BSD, esto debería funcionar, pero en una caja Linux, podrías necesitar enviar un SIGUSR1, y/o tar
podría no funcionar de la misma manera.
El lado negativo es que sólo le proporcionará una salida (en stdout) que le mostrará lo lejos que está del archivo actual, ya que supongo que no tiene idea de lo grande que es el flujo de datos que está recibiendo.
Así que sí, un enfoque alternativo sería disparar tar y enviarle periódicamente SIGINFOs cada vez que quieras saber hasta dónde ha llegado. ¿Cómo hacer esto?
El enfoque ad-hoc, manual
Si quiere ser capaz de comprobar el estado de forma ad-hoc, puede pulsar control-T
(como Brian Swift mencionó) en la ventana correspondiente que enviará la señal SIGINFO. Un problema con esto es que lo enviará a toda tu cadena, creo, así que si estás haciendo:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
También verás que bzip2 informa de 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 sólo quieres comprobar si ese tar
que estás ejecutando está atascado, o simplemente es lento. Probablemente no tengas que preocuparte demasiado por los problemas de formato en este caso, ya que es sólo una comprobación rápida..
El tipo de aproximación automatizada
Si sabes que va a tomar un tiempo, pero quieres algo como un indicador de progreso, una alternativa sería disparar tu proceso tar y en otra terminal calcular su PID y luego lanzarlo en un script que simplemente envíe repetidamente una señal. Por ejemplo, si tienes el siguiente scriptlet (y lo invocas 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?"
Si lo invocas de esta manera, ya que estás apuntando sólo a tar
obtendrás una salida más 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 admito, es bastante bonita.
Por último, pero no por ello menos importante, mi programación está un poco oxidada, así que si alguien quiere ir a limpiar/corregir/mejorar el código, que se anime :)