Ik zag net de opmerking over MacOS, en hoewel ik denk dat de oplossing van @akira (en pv) veel netter is, dacht ik een ingeving na te jagen en een snelle playaround in mijn MacOS box met tar en het sturen van een SIGINFO signaal. Grappig genoeg werkte het :) als je op een BSD-achtig systeem zit, zou dit moeten werken, maar op een Linux box moet je misschien een SIGUSR1 sturen, en/of tar
werkt misschien niet op dezelfde manier.
Het nadeel is dat het je alleen een output (op stdout) geeft die je laat zien hoe ver het huidige bestand is, omdat ik denk dat het geen idee heeft hoe groot de datastroom is die het binnenhaalt.
Dus ja, een alternatieve aanpak zou zijn om tar te starten en het periodiek SIGINFO’s te sturen op elk moment dat je wilt weten hoe ver het is gekomen. Hoe doe je dat?
De ad-hoc, handmatige aanpak
Als je de status op een ad-hoc basis wilt kunnen controleren, kun je in het betreffende venster op control-T
drukken (zoals Brian Swift zei), dat stuurt het SIGINFO signaal door. Een probleem daarbij is dat het naar je hele keten wordt gestuurd, geloof ik, dus als je doet:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Je zult ook bzip2 zijn status zien rapporteren samen met 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)
Dit werkt prima als je alleen maar wilt controleren of die tar
die je draait vastzit, of gewoon traag is. Je hoeft je waarschijnlijk niet al te veel zorgen te maken over formatteringsproblemen in dit geval, aangezien het slechts een snelle controle is…
De geautomatiseerde aanpak
Als je weet dat het een tijdje gaat duren, maar je wilt toch een soort voortgangsindicator, dan is een alternatief om je tar proces af te vuren en in een andere terminal zijn PID uit te rekenen en die dan in een script te gooien dat herhaaldelijk een signaal verstuurt. Bijvoorbeeld, als je het volgende scriptlet hebt (en het aanroept als bijvoorbeeld 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?"
Als je het op deze manier aanroept, omdat je je alleen op tar
richt, krijg je een uitvoer die er meer als volgt uitziet
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)
...
wat, dat geef ik toe, best wel mooi is.
Last but not least - mijn scripting is een beetje roestig, dus als iemand de code wil opkuisen/fixen/verbeteren, ga je gang :)