Только что заметил комментарий о 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)
...
что я признаю, это довольно мило.
И последнее, но не менее важное - мой сценарий довольно ржавый, поэтому, если кто-то захочет пойти и почистить / исправить / улучшить код, продолжайте в том же духе :)