Только что заметил комментарий о MacOS, и хотя я думаю, что решение от @akira (и pv) гораздо точнее, я подумал, что я поймал догадку и быстрый обходной путь в моей коробке MacOS с tar и отправил бы ему сигнал SIGINFO. Как ни странно, это сработало :), если вы работаете в BSD-подобной системе, это должно работать, но на Linux-боксе вам может потребоваться отправить SIGUSR1 и / или tar
может не работать так же.
Недостатком является то, что он предоставит вам только вывод (на стандартный вывод), показывающий, как далеко находится текущий файл, так как я предполагаю, что он понятия не имеет, насколько велик поток данных, который он получает.
Так что да, альтернативный подход - запускать tar и периодически отправлять SIGINFO каждый раз, когда вы хотите узнать, как далеко он продвинулся. Как это сделать?
Специальный ручной подход
Если вы хотите иметь возможность проверять статус на специальной основе, вы можете нажать control-T
(как упомянул Брайан Свифт) в соответствующем окне, которое передаст сигнал SIGINFO. Я полагаю, что проблема в том, что он отправит его всей вашей цепочке, так что если вы делаете:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Вы также увидите bzip2 отчет о его статусе вместе с 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)
Это хорошо работает, если вы просто хотите проверить, зависает ли tar
ваш бег, или просто медленно. В этом случае вам, вероятно, не нужно слишком беспокоиться о проблемах форматирования, так как это всего лишь быстрая проверка.
Этакий автоматизированный подход
Если вы знаете, что это займет некоторое время, но хотите что-то вроде индикатора прогресса, альтернативой может быть запуск вашего процесса tar, а в другом терминале определить его PID, а затем выбросить его в скрипт, который просто несколько раз посылает сигнал через , Например, если у вас есть следующий скриптлет (и вызовите его, как говорится 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?"
Если вы вызываете его таким образом, поскольку вы нацеливаетесь только на него, tar
вы получите более похожий результат
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)
...
что я признаю, это довольно мило.
И последнее, но не менее важное - мои скрипты довольно ржавые, поэтому, если кто-то захочет пойти и почистить / исправить / улучшить код, продолжайте свою жизнь :)