Właśnie zauważyłem komentarz o MacOS, i chociaż myślę, że rozwiązanie od @akira (i pv) jest dużo zgrabniejsze, pomyślałem, że będę ścigał przeczucie i szybkie playaround w moim pudełku MacOS z tar i wysyłając mu sygnał SIGINFO. Co zabawne, zadziałało :) jeśli jesteś na systemie podobnym do BSD, to powinno zadziałać, ale na Linuksie, możesz potrzebować wysłać SIGUSR1, i/lub tar
może nie działać w ten sam sposób.
Minusem jest to, że dostarczy ci tylko wyjście (na stdout) pokazujące jak daleko w bieżącym pliku jest, ponieważ zgaduję, że nie ma pojęcia o tym, jak duży jest strumień danych, który dostaje.
Więc tak, alternatywnym podejściem byłoby odpalenie tar'a i okresowe wysyłanie mu SIGINFO za każdym razem, gdy chcesz wiedzieć jak daleko zaszedł. Jak to zrobić?
Podejście ręczne, ad-hoc
Jeśli chcesz mieć możliwość sprawdzania stanu ad-hoc, możesz uderzyć control-T
(jak wspomniał Brian Swift) w odpowiednim oknie, co spowoduje wysłanie sygnału SIGINFO. Jednym problemem z tym jest to, że wyśle go do całego łańcucha, jak sądzę, więc jeśli robisz:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
zobaczysz również, że bzip2 zgłasza swój status razem 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)
To działa ładnie, jeśli chcesz tylko sprawdzić, czy ten tar
, który uruchamiasz, utknął, czy po prostu jest powolny. Prawdopodobnie nie musisz się zbytnio martwić o kwestie formatowania w tym przypadku, ponieważ jest to tylko szybkie sprawdzenie.
Rodzaj zautomatyzowanego podejścia
Jeśli wiesz, że zajmie to trochę czasu, ale chcesz mieć coś w rodzaju wskaźnika postępu, alternatywą byłoby odpalenie procesu tar i w 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 skrypt (i wywołujesz go jako 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 go w ten sposób, ponieważ celujesz tylko w tar
, otrzymasz wyjście bardziej zbliżone do tego
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 całkiem ładne.
Last but not least - moje skrypty są trochę zardzewiałe, więc jeśli ktoś chce się zabrać za czyszczenie/poprawianie/ulepszanie kodu, to proszę bardzo :)