Просто заметил комментарий о MacOS, и в то время как я думаю, что решение от @akira (и pv) является much аккуратнее я думал, что я буду гоняться за догадкой и быстрое воспроизведение в моем MacOS окне с смолой и посылая ему сигнал SIGINFO. Забавно, но это сработало :) если Вы на BSD-подобной системе, это should работает, но на Linux-боксе, Вам может понадобиться послать SIGUSR1, и/или tar
может работать не так, как раньше.
Отрицательным моментом является то, что он выдает только вывод (на stdout), показывающий, как далеко он прошел через текущий файл, так как я полагаю, что он не имеет представления о том, какой большой поток данных он получает.
Так что да, альтернативным подходом будет зажигание смолы и периодическая отправка ей 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)
...
, который, я признаю, вроде как хорош.
И последнее, но не менее важное - мой скриптинг вроде как ржавый, так что если кто-то хочет войти и почистить/ исправить/улучшить код, идите за свою жизнь :)