batas waktu, putus pipa dan wc

20

Saya punya ide untuk segera membandingkan beberapa program dekompresi. Misalnya untuk gz, saya akan menjalankan perintah:

timeout 10 zcat foo.gz | wc -c

Yang akan mengukur jumlah data yang dapat diekstrak oleh decompressor dalam 10 detik.

Satu-satunya masalah adalah, itu tidak berfungsi: karena zcat terbunuh, wc juga terbunuh, jadi saya tidak mendapatkan jumlah byte, hanya Terminatedpesan.

Jadi, pertanyaannya adalah: apakah ada cara untuk mendapatkan hitungan dari wc , baik dengan memblokir sinyal entah bagaimana, atau menggunakan alternatif alih-alih wc yang mencetak hasil bahkan ketika mendapat sinyal istilah.


Tentu saja, ada alternatif:

  1. Menulis ke file sementara:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x Masalahnya adalah ini menggunakan banyak memori, dan mungkin juga memiliki beberapa penalti kinerja.

  2. Sebagai gantinya menggunakan ulimit:
    ulimit -t 10; zcat foo.gz | wc -c
    Ini juga berfungsi, tetapi hanya mengukur waktu cpu, jadi pelambatan karena I / O (misalnya karena kompresi lebih buruk, dan lebih banyak byte perlu dibaca dari disk) tidak diukur.

  3. Membuat file tes yang lebih kecil:
    Ya, ini bisa bekerja tentu saja, dan mungkin solusi terbaik. Namun, ini menciptakan banyak file sementara.

P.Péter
sumber
6
Ketika saya membaca "memecahkan pipa dan wc" Saya pikir pada awalnya Anda mengalami masalah dengan pipa ledeng Anda!
dr01

Jawaban:

21

Anda dapat menempatkan perintah batas waktu dalam subkulit dan membuatnya berhasil:

( timeout 10 <command> || true ) | wc -c
Marco
sumber
3
Membuat perintah yang gagal berhasil? Oh, ini terlihat sangat jahat: D
Erathiel
17
@Erathiel Ingin tersenyum sambil menjadi jahat? Coba yang ini (ini setara dengan yang di atas):(timeout 10 <command> || :) | wc -c
Marco
1
Saya mencoba menggunakan subkulit, tetapi tidak berpikir untuk membuatnya berhasil. Luar biasa!
P.Péter
2

Tepat setelah memposting, saya berpikir untuk menggunakan pipa bernama untuk proses:

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

Ini sepertinya berhasil.

P.Péter
sumber