ติดตามความคืบหน้าด้วย xargs


11

ฉันใช้ xargs เพื่อรันคำสั่งในชุดของพารามิเตอร์การป้อนข้อมูลบางอย่างเช่นนี้

cat <someinput> | xargs -n 1 -P 5 <somecmd>

ไฟล์อินพุตนั้นยาวและใช้เวลานานในการรัน ดังนั้นฉันแค่รอให้พรอมต์คำสั่งปรากฏขึ้น มีวิธีแสดงแถบความคืบหน้าสำหรับจำนวนอาร์กิวเมนต์ที่มีการป้อนข้อมูลที่เสร็จสมบูรณ์หรือไม่?

ฉันพยายามใช้ 'บาร์' แต่ฉันได้รับ 'ไม่มีที่สิ้นสุด' เสมอ ดูเหมือนว่า xargs จะอ่านอินพุตทั้งหมดก่อนดำเนินการคำสั่ง

http://i.stack.imgur.com/5Wsgx.gif

คำตอบ:


13

หากคุณมี GNU Parallel คุณสามารถเรียกใช้:

cat <someinput> | parallel --bar -P 5 <somecmd>

GNU Parallel เป็นตัวขยายสัญญาณทั่วไปและทำให้การเรียกใช้งานแบบขนานบนเครื่องเดียวกันหรือบนเครื่องหลายเครื่องที่คุณเข้าถึงได้ง่าย

หากคุณมีงานที่แตกต่างกัน 32 งานที่คุณต้องการเรียกใช้บน 4 CPU ทางตรงไปข้างหน้าเพื่อขนานคือการรัน 8 งานในแต่ละ CPU:

การตั้งเวลาอย่างง่าย

GNU Parallel แทนการวางกระบวนการใหม่เมื่อเสร็จสิ้น - ทำให้ซีพียูทำงานและประหยัดเวลา:

GNU Parallel Scheduling

การติดตั้ง

การติดตั้งส่วนบุคคลไม่ต้องการการเข้าถึงรูท สามารถทำได้ภายใน 10 วินาทีโดยทำสิ่งนี้:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

สำหรับตัวเลือกการติดตั้งอื่น ๆ ดูที่http://git.savannah.gnu.org/cgit/parallel.git/tree/README

เรียนรู้เพิ่มเติม

ดูตัวอย่างเพิ่มเติม: http://www.gnu.org/software/parallel/man.html

ดูวิดีโอแนะนำ: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

ดำเนินการตามบทช่วยสอน: http://www.gnu.org/software/parallel/parallel_tutorial.html

ลงทะเบียนเพื่อรับรายชื่ออีเมลเพื่อรับการสนับสนุน: https://lists.gnu.org/mailman/listinfo/parallel


1
ขอบคุณมาก (สำหรับคำตอบและสำหรับการเขียนซอฟต์แวร์!) มันใช้งานได้ดีมาก!
Greg Sadetsky

9

คุณสามารถใช้ pv:

cat <someinput> | pv -p -s sizeof_someimput | xargs -n 1 -P 5 <somecmd>

ด้วยวิธีนี้คุณจะได้รู้ว่าการอ่านค่าของบางตำแหน่งนั้นอยู่ที่ใดดังนั้นคุณจะรู้ว่าการรักษาค่าบางค่านั้นอยู่ที่ใด


1
อีกกรณีการใช้งานบ่อยอาจเป็นการรวมกันกับการค้นหา:FIND=( find "$DIR" -type f ) && ${FIND[@]} -print0 | pv -0lps $(${FIND[@]} | wc -l) | xargs -0 -I {} -P 5 <somecmd>
mxmlnkn

3

หากคุณกำลังมองหาตัวบ่งชี้ความคืบหน้าทั่วไปวิธีที่ง่ายที่สุดคือเพียงแค่ก้องก่อนที่จะทำคำสั่งที่คุณต้องการทำ

ตัวอย่าง: cat <someinput> | xargs -I{} sh -c 'echo {}; <somecmd>;'

-I{}ตั้งค่า{}เป็นสตริงปัจจุบันที่กำลังประมวลผล

sh -cจะช่วยให้คุณสามารถรันคำสั่งหลาย (หมายเหตุ: กึ่งลำไส้ใหญ่หลังจากทุกคำสั่งจะต้องรวมถึงคนสุดท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.