Chỉ cần chú ý nhận xét về MacOS, và trong khi tôi nghĩ rằng giải pháp từ @akira (và pv) gọn gàng hơn nhiều thì tôi nghĩ tôi sẽ đuổi theo một linh cảm và một cách chơi nhanh trong hộp MacOS của mình bằng tar và gửi tín hiệu SIGINFO. Thật thú vị, nó đã hoạt động :) nếu bạn đang sử dụng hệ thống giống như BSD, thì nó sẽ hoạt động, nhưng trên hộp Linux, bạn có thể cần gửi SIGUSR1 và / hoặc tar
có thể không hoạt động theo cách tương tự.
Mặt trái là nó sẽ chỉ cung cấp cho bạn một đầu ra (trên thiết bị xuất chuẩn) cho bạn thấy tệp đó hiện tại bao xa vì tôi đoán nó không biết luồng dữ liệu mà nó nhận được lớn đến mức nào.
Vì vậy, có, một cách tiếp cận khác là kích hoạt tar và định kỳ gửi SIGINFO bất cứ khi nào bạn muốn biết nó đã đi được bao xa. làm như thế nào?
Cách tiếp cận thủ công, đặc biệt
Nếu bạn muốn có thể kiểm tra trạng thái trên cơ sở đặc biệt, bạn có thể nhấn control-T
(như Brian Swift đã đề cập) trong cửa sổ có liên quan sẽ gửi tín hiệu SIGINFO qua. Một vấn đề với nó là nó sẽ gửi nó đến toàn bộ chuỗi của bạn, vì vậy nếu bạn đang làm:
% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2
Bạn cũng sẽ thấy bzip2 báo cáo trạng thái của nó cùng với 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)
Điều này hoạt động độc đáo nếu bạn chỉ muốn kiểm tra xem tar
bạn đang chạy có bị kẹt hay chỉ chậm. Có lẽ bạn không cần phải lo lắng quá nhiều về các vấn đề định dạng trong trường hợp này, vì đó chỉ là một kiểm tra nhanh ..
Cách tiếp cận tự động
Nếu bạn biết rằng sẽ mất một thời gian, nhưng muốn một cái gì đó giống như một chỉ báo tiến trình, một giải pháp thay thế sẽ là loại bỏ quy trình tar của bạn và trong một thiết bị đầu cuối khác xử lý nó và sau đó ném nó vào một tập lệnh liên tục gửi tín hiệu . Ví dụ: nếu bạn có scriptlet sau (và gọi nó như nói 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?"
Nếu bạn gọi nó theo cách này, vì bạn chỉ nhắm mục tiêu, tar
bạn sẽ nhận được một đầu ra giống như thế này
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)
...
mà tôi thừa nhận, là khá đẹp.
Cuối cùng nhưng không kém phần quan trọng - kịch bản của tôi hơi bị rỉ sét, vì vậy nếu có ai muốn vào và dọn dẹp / sửa chữa / cải thiện mã, hãy tiếp tục cuộc sống của bạn :)