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.


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.