หมดเวลา, ทำลายท่อและห้องสุขา


20

ฉันมีความคิดที่จะเปรียบเทียบโปรแกรมบีบอัดข้อมูลอย่างรวดเร็ว เช่นสำหรับ gz ฉันจะเรียกใช้คำสั่ง:

timeout 10 zcat foo.gz | wc -c

ซึ่งจะวัดปริมาณข้อมูลที่ตัวขยายการบีบอัดสามารถแยกได้ใน 10 วินาที

ปัญหาเดียวก็คือว่ามันใช้งานไม่ได้: เนื่องจาก zcat ถูกฆ่า, wc ก็ถูกฆ่าด้วยดังนั้นฉันจึงไม่ได้รับจำนวนไบต์เพียงแค่Terminatedข้อความ

ดังนั้นคำถามคือ: มีวิธีที่จะได้รับการนับจาก wcโดยการปิดกั้นสัญญาณอย่างใดอย่างหนึ่งหรือใช้ทางเลือกแทน wc ที่พิมพ์ผลแม้ว่ามันจะได้รับสัญญาณระยะ


แน่นอนว่ามีทางเลือกอื่น ๆ :

  1. การเขียนไปยังไฟล์ชั่วคราว:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x ปัญหาที่เกิดขึ้นคือใช้หน่วยความจำจำนวนมากและอาจมีการปรับประสิทธิภาพบางอย่าง

  2. การใช้ ulimit แทน:
    ulimit -t 10; zcat foo.gz | wc -c
    วิธีนี้ใช้ได้ผล แต่ใช้เวลา cpu เท่านั้นดังนั้นการชะลอตัวเนื่องจาก I / O (เช่นเนื่องจากการบีบอัดยิ่งแย่ลงและจำเป็นต้องอ่านไบต์เพิ่มเติมจากดิสก์)

  3. การสร้างไฟล์ทดสอบขนาดเล็ก:
    ก็สามารถใช้งานได้แน่นอนและอาจเป็นทางออกที่ดีที่สุด อย่างไรก็ตามสิ่งนี้จะสร้างไฟล์ชั่วคราวจำนวนมาก


6
เมื่อฉันอ่าน "การทำลายท่อและสุขา" ตอนแรกฉันคิดว่าคุณกำลังมีปัญหากับท่อประปาของคุณ!
dr01

คำตอบ:


21

คุณสามารถวางคำสั่ง timeout ใน subshell และทำให้สำเร็จ:

( timeout 10 <command> || true ) | wc -c

3
ทำให้คำสั่งล้มเหลวสำเร็จหรือไม่ โอ้นี่มันช่างเลวร้าย
จริงๆ

17
@Erathiel ต้องการที่จะยิ้มในขณะที่เป็นความชั่วร้าย? ลองอันนี้ (เทียบเท่ากับด้านบน):(timeout 10 <command> || :) | wc -c
มาร์โก

1
ฉันพยายามใช้ subshell แต่ไม่ได้คิดว่าจะทำให้สำเร็จ ยอดเยี่ยม
P.Péter

2

หลังจากโพสต์ฉันมีความคิดที่จะใช้ไปป์ที่มีชื่อสำหรับกระบวนการ:

mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &

ดูเหมือนว่าจะใช้งานได้

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