Ich habe gerade den Kommentar zu MacOS bemerkt und obwohl ich denke, dass die Lösung von @akira (und pv) viel besser ist , dachte ich, ich würde eine Vermutung und eine schnelle Umgehung in meiner MacOS-Box mit Teer verfolgen und ein SIGINFO-Signal senden. Komischerweise hat es funktioniert :) Wenn Sie auf einem BSD-ähnlichen System arbeiten, sollte dies funktionieren, aber auf einer Linux-Box müssen Sie möglicherweise ein SIGUSR1 senden und / oder tar
funktionieren möglicherweise nicht auf die gleiche Weise.
Der Nachteil ist, dass Sie nur eine Ausgabe (auf stdout) erhalten, die zeigt, wie weit die aktuelle Datei reicht, da ich vermute, dass sie keine Ahnung davon hat, wie groß der Datenstrom ist, den sie erhält.
Also ja, ein alternativer Ansatz wäre, Teer zu zünden und ihm regelmäßig SIGINFOs zu senden, wann immer Sie wissen möchten, wie weit es gekommen ist. Wie macht man das?
Der ad-hoc, manuelle Ansatz
Wenn Sie in der Lage sein möchten, den Status ad-hoc zu überprüfen, können Sie control-T
(wie von Brian Swift erwähnt) das entsprechende Fenster anklicken, das das SIGINFO-Signal weiterleitet. Ein Problem dabei ist, dass es meiner Meinung nach an Ihre gesamte Kette gesendet wird. Wenn Sie also Folgendes tun:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Sie werden auch sehen, dass bzip2 seinen Status zusammen mit tar meldet:
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)
Dies funktioniert sehr gut, wenn Sie nur überprüfen möchten, ob das Programm nicht funktioniert tar
oder nur langsam. In diesem Fall müssen Sie sich wahrscheinlich nicht zu viele Gedanken über Formatierungsprobleme machen, da es sich nur um eine schnelle Überprüfung handelt.
Die Art des automatisierten Ansatzes
Wenn Sie wissen, dass es eine Weile dauern wird, Sie aber eine Art Fortschrittsanzeige benötigen, besteht eine Alternative darin, Ihren Teerprozess auszulösen und in einem anderen Terminal die PID zu ermitteln und sie dann in ein Skript zu werfen, das nur wiederholt ein Signal sendet . Wenn Sie beispielsweise das folgende Scriptlet haben (und es als say aufrufen 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?"
Wenn Sie es auf diese Weise aufrufen, erhalten Sie tar
eine Ausgabe wie diese , da Sie nur das Targeting durchführen
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)
...
was ich zugebe, ist irgendwie hübsch.
Last but not least - mein Scripting ist ein bisschen verrostet. Wenn also jemand den Code bereinigen, reparieren oder verbessern möchte, dann ist alles in Ordnung :)