zaman aşımı, kırma boruları ve wc


20

Bazı dekompresyon programlarını hızlı bir şekilde karşılaştırma fikrim vardı. Örneğin, gz için şu komutu çalıştırırım:

timeout 10 zcat foo.gz | wc -c

Bu, dekompresörün 10 saniye içinde çıkarabileceği veri miktarını ölçer.

Tek sorun, işe yaramamasıdır: zcat öldürüldüğünde, wc de öldürülür, bu nedenle bayt sayısını almıyorum, sadece bir Terminatedmesaj.

Yani, soru şudur: sayıyı bir şekilde engelleyerek wc'den saymayı almanın veya bir terim sinyali aldığında bile bir sonucu basan wc yerine bir alternatif kullanmanın bir yolu var mı?


Tabii ki alternatifler var:

  1. Geçici bir dosyaya yazma:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x Bununla ilgili sorun, çok fazla bellek kullanması ve ayrıca bazı performans cezalarına sahip olmasıdır.

  2. Bunun yerine ulimit kullanımı:
    ulimit -t 10; zcat foo.gz | wc -c
    Bu da çalışır, ancak yalnızca cpu süresini ölçer, bu nedenle G / Ç nedeniyle yavaşlama (örneğin sıkıştırma daha kötü olduğu ve diskten daha fazla bayt okunması gerektiği için) ölçülmez.

  3. Daha küçük test dosyaları yapmak:
    Bu elbette işe yarayabilir ve en güzel çözüm olabilir. Ancak, bu çok sayıda geçici dosya oluşturur.


6
Ben "boruları ve wc kırma" okurken ilk başta sıhhi tesisat ile sorunlarınız olduğunu düşündüm!
dr01

Yanıtlar:


21

Zaman aşımı komutunu bir alt kabuğa yerleştirebilir ve başarılı olmasını sağlayabilirsiniz:

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

3
Başarısız bir komut başarılı mı oluyor? Oh, bu çok kötü görünüyor: D
Erathiel

17
@Erathiel Kötülük yaparken gülümsemek ister misin? Bunu deneyin (yukarıdakine eşdeğerdir):(timeout 10 <command> || :) | wc -c
Marco

1
Bir alt kabuk kullanmayı denedim, ancak başarılı olmasını düşünmedim. Mükemmel!
P.Péter

2

Gönderdikten hemen sonra, süreç için adlandırılmış borular kullanmayı düşündüm:

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

Bu işe yarıyor gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.