Ho appena notato il commento su MacOS, e mentre penso che la soluzione di @akira (e pv) sia molto più ordinata ho pensato di inseguire un'intuizione e un veloce playaround nella mia scatola MacOS con tar e inviandogli un segnale SIGINFO. Stranamente, ha funzionato :) se siete su un sistema simile a BSD, questo dovrebbe funzionare, ma su una macchina Linux, potreste aver bisogno di inviare un SIGUSR1, e/o tar
potrebbe non funzionare allo stesso modo.
Il lato negativo è che vi fornirà solo un output (su stdout) che vi mostrerà a che punto è il file corrente, poiché immagino che non abbia idea di quanto sia grande il flusso di dati che sta ricevendo.
Quindi sì, un approccio alternativo sarebbe quello di avviare tar e inviargli periodicamente dei SIGINFO ogni volta che volete sapere a che punto è arrivato. Come si fa?
L'approccio manuale ad-hoc
Se vuoi essere in grado di controllare lo stato su una base ad-hoc, puoi premere control-T
(come ha detto Brian Swift) nella relativa finestra che invierà il segnale SIGINFO. Un problema con questo è che lo invierà a tutta la vostra catena, credo, quindi se state facendo:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Vedrete anche bzip2 segnalare il suo stato insieme a 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)
Questo funziona bene se volete solo controllare se quel tar
che state eseguendo è bloccato, o semplicemente lento. Probabilmente non hai bisogno di preoccuparti troppo dei problemi di formattazione in questo caso, dato che è solo un controllo veloce.
Il tipo di approccio automatico
Se sai che ci vorrà un po’ di tempo, ma vuoi qualcosa come un indicatore di progresso, un'alternativa potrebbe essere quella di lanciare il tuo processo tar e in un altro terminale lavorare sul suo PID e poi lanciarlo in uno script che invia ripetutamente un segnale. Per esempio, se avete il seguente scriptlet (e lo invocate come 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 lo invocate in questo modo, poiché state puntando solo a tar
otterrete un output più simile a questo
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)
...
che, ammetto, è piuttosto carino.
Ultimo ma non meno importante - il mio scripting è un po’ arrugginito, quindi se qualcuno vuole andare a pulire/correggere/migliorare il codice, vada per la sua vita :)