Właśnie zauważyłem komentarz na temat MacOS i chociaż myślę, że rozwiązanie z @akira (i pv) jest znacznie fajniejsze, pomyślałem, że ścigam przeczucie i szybkie zagranie w moim MacOS z tar i wysyłając mu sygnał SIGINFO. Co zabawne, zadziałało :) jeśli korzystasz z systemu podobnego do BSD, powinno to działać, ale na Linux-ie może być konieczne wysłanie SIGUSR1 i / lub tar
może nie działać w ten sam sposób.
Wadą jest to, że zapewni ci tylko wyjście (na standardowym wyjściu) pokazujące, jak daleko jest do bieżącego pliku, ponieważ domyślam się, że nie ma pojęcia o tym, jak duży jest strumień danych.
Tak więc, alternatywnym podejściem byłoby odpalenie tar i okresowe wysyłanie jej SIGINFO w dowolnym momencie, aby dowiedzieć się, jak daleko się zaszła. Jak to zrobić?
Podejście ad hoc, ręczne
Jeśli chcesz mieć możliwość sprawdzania statusu na zasadzie ad hoc, możesz nacisnąć control-T
(jak wspomniano Brian Swift) w odpowiednim oknie, które prześle sygnał SIGINFO. Jednym z problemów jest to, że przesyła to do całego łańcucha, wierzę, więc jeśli robisz:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Zobaczysz także raport bzip2 o jego statusie wraz z 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)
Działa to dobrze, jeśli chcesz po prostu sprawdzić, tar
czy Twój bieg jest zablokowany lub po prostu wolny. W tym przypadku prawdopodobnie nie musisz się zbytnio przejmować problemami z formatowaniem, ponieważ jest to tylko szybkie sprawdzenie ...
Rodzaj zautomatyzowanego podejścia
Jeśli wiesz, że zajmie to trochę czasu, ale potrzebujesz czegoś w rodzaju wskaźnika postępu, alternatywą byłoby odpalenie procesu tar, a na innym terminalu ustalenie jego PID, a następnie wrzucenie go do skryptu, który po prostu wielokrotnie wysyła sygnał . Na przykład, jeśli masz następujący skryptlet (i wywołujesz go jak powiedzmy 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?"
Jeśli wywołasz to w ten sposób, ponieważ celujesz tylko tar
, uzyskasz bardziej podobny wynik
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)
...
co przyznaję, jest dość ładne.
Last but not least - moje skrypty są trochę zardzewiałe, więc jeśli ktoś chce wejść i wyczyścić / naprawić / poprawić kod, idź po swoje życie :)