thời gian chờ, phá vỡ đường ống và wc


20

Tôi đã có một ý tưởng để nhanh chóng điểm chuẩn một số chương trình giải nén. Ví dụ: đối với gz, tôi sẽ chạy lệnh:

timeout 10 zcat foo.gz | wc -c

Mà sẽ đo lượng dữ liệu mà bộ giải nén có thể trích xuất trong 10 giây.

Vấn đề duy nhất là, nó không hoạt động: vì zcat bị giết, wc cũng bị giết, vì vậy tôi không nhận được số byte, chỉ là một Terminatedtin nhắn.

Vì vậy, câu hỏi là: có cách nào để lấy số đếm từ wc , bằng cách chặn tín hiệu bằng cách nào đó hoặc sử dụng thay thế thay vì wc in kết quả ngay cả khi nhận được tín hiệu hạn.


Tất nhiên, có những lựa chọn thay thế:

  1. Viết vào một tệp tạm thời:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x Vấn đề với điều này là sử dụng rất nhiều bộ nhớ và cũng có thể có một số hình phạt về hiệu suất.

  2. Thay vào đó, sử dụng ulimit:
    ulimit -t 10; zcat foo.gz | wc -c
    Điều này cũng hoạt động, nhưng chỉ đo thời gian cpu, do đó làm chậm do I / O (ví dụ do quá trình nén kém hơn và không thể đọc thêm byte từ đĩa).

  3. Tạo các tệp thử nghiệm nhỏ hơn:
    Tất nhiên, điều này có thể hoạt động và có thể là giải pháp tốt nhất. Tuy nhiên, điều này tạo ra rất nhiều tập tin tạm thời.


6
Khi tôi đọc "phá vỡ đường ống và wc", ban đầu tôi nghĩ bạn đang gặp vấn đề với hệ thống ống nước của mình!
dr01

Câu trả lời:


21

Bạn có thể đặt lệnh hết thời gian trong một khung con và làm cho nó thành công:

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

3
Làm một lệnh thất bại thành công? Ôi, điều này trông thật xấu xa: D
Erathiel

17
@Erathiel Muốn cười khi ác? Hãy thử cái này (tương đương với cái trên):(timeout 10 <command> || :) | wc -c
Marco

1
Tôi đã thử sử dụng một subshell, nhưng không nghĩ đến việc làm cho nó thành công. Xuất sắc!
P.Péter

2

Ngay sau khi đăng, tôi đã có ý nghĩ sử dụng các đường ống có tên cho quy trình:

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

Điều này dường như làm việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.