Щойно помітив коментар щодо MacOS, і, хоча я думаю, що рішення від @akira (і pv) набагато акуратніше, я подумав, що переслідую хитру і швидку ситуацію в моєму вікні MacOS з дьогтем і надсилаю йому сигнал SIGINFO. Як не дивно, що це спрацювало :) якщо ви працюєте з системою, схожою на BSD, це має працювати, але у вікні Linux вам може знадобитися надіслати SIGUSR1 та / або tar
не працювати так само.
Нижня сторона полягає в тому, що вона надасть вам лише вихід (у stdout), який показує вам, наскільки далеко проходить поточний файл, оскільки я здогадуюсь, він не має поняття про те, наскільки великий потік даних він отримує.
Отже, так, альтернативним підходом було б розпалювати дьоготь і періодично надсилати його СІГІНФО в будь-який час, коли ви хочете дізнатися, наскільки він дійшов. Як це зробити?
Спеціальний, ручний підхід
Якщо ви хочете мати можливість перевірити стан на спеціальній основі, ви можете натиснути control-T
(як згадував Брайан Свіфт) у відповідне вікно, яке надішле сигнал SIGINFO поперек. Одне питання з цим полягає в тому, що я надішлю його на весь ваш ланцюг, я вважаю, тож якщо ви це робите:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Ви також побачите звіт про bzip2 про його статус разом із дьогтем:
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
ви, чи просто повільний. Можливо, вам не потрібно надто турбуватися про проблеми форматування в цьому випадку, оскільки це лише швидка перевірка.
Вид автоматизованого підходу
Якщо ви знаєте, що це займе певний час, але ви хочете щось на зразок індикатора прогресу, альтернативою може бути звільнення вашого тарного процесу, а в іншому терміналі розробити його 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)
...
що я визнаю, це свого роду досить.
І останнє, але не менш важливе - мої сценарії начебто іржаві, тому якщо хтось захоче зайти і почистити / виправити / покращити код, продовжуйте своє життя :)