เพิ่งสังเกตเห็นความคิดเห็นเกี่ยวกับ MacOS และในขณะที่ฉันคิดว่าวิธีแก้ปัญหาจาก @akira (และ pv) นั้นเป็นสิ่งที่เลวร้ายมากฉันคิดว่าฉันไล่ล่าลางสังหรณ์และเล่นรอบอย่างรวดเร็วในกล่อง MacOS ของฉันด้วยน้ำมันดินและส่งสัญญาณ SIGINFO สนุกมากพอมันทำงานได้ดี :) ถ้าคุณอยู่ในระบบที่เหมือน BSD สิ่งนี้น่าจะใช้ได้ แต่บนกล่อง Linux คุณอาจต้องส่ง SIGUSR1 และ / หรือtar
อาจไม่ทำงานเหมือนกัน
ข้อเสียคือมันจะให้ผลลัพธ์ (ที่ stdout) เพียงแสดงให้คุณเห็นว่าไฟล์ปัจจุบันมันไกลแค่ไหนเนื่องจากฉันคิดว่ามันไม่รู้ว่ากระแสข้อมูลที่ได้รับนั้นใหญ่แค่ไหน
ดังนั้นใช่วิธีการทางเลือกคือการเผาไหม้น้ำมันดินและส่ง SIGINFOs เป็นระยะ ๆ เมื่อใดก็ตามที่คุณต้องการทราบว่ามันได้รับไปไกลแค่ไหน ทำอย่างไร
Ad-hoc แนวทางแบบแมนนวล
หากคุณต้องการตรวจสอบสถานะแบบเฉพาะกิจคุณสามารถกดcontrol-T
(ตามที่ Brian Swift กล่าวถึง) ในหน้าต่างที่เกี่ยวข้องซึ่งจะส่งสัญญาณ 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 แล้วโยนมันลงในสคริปต์ที่ส่งสัญญาณซ้ำ ๆ . ตัวอย่างเช่นหากคุณมี scriptlet ต่อไปนี้ (และเรียกใช้ตามที่พูด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)
...
ซึ่งฉันยอมรับว่าเป็นคนที่ค่อนข้างสวย
สุดท้าย แต่ไม่ท้ายสุด - สคริปต์ของฉันมันช่างเป็นสนิมดังนั้นถ้าใครอยากเข้าไปข้างในและทำความสะอาด / แก้ไข / ปรับปรุงโค้ดให้ดีที่สุดเพื่อชีวิตของคุณ :)