тайм-аут, разрыв труб и туалет

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
    это также работает, но измеряет только время процессора, поэтому замедление из-за операций ввода-вывода (например, из-за того, что сжатие хуже и нужно читать больше байтов с диска) не измеряется.

  3. Создание меньших тестовых файлов:
    ну, это может сработать, конечно, и может быть самым хорошим решением. Тем не менее, это создает много временных файлов.

P.Péter
источник
6
Когда я читал «Разрыв труб и туалет», я сначала подумал, что у вас проблемы с сантехникой!
dr01

Ответы:

21

Вы можете поместить команду timeout в подоболочку и сделать ее успешной:

( timeout 10 <command> || true ) | wc -c
Marco
источник
3
Сделать неудачную команду успешной? О, это выглядит так злобно: D
Эратиэль
17
@Erathiel Хотите улыбаться, будучи злым? Попробуйте это (это эквивалентно вышеупомянутому):(timeout 10 <command> || :) | wc -c
Марко
1
Я пытался использовать подоболочку, но не думал, что это удастся. Отлично!
П.Петр
2

Сразу после публикации у меня появилась мысль использовать именованные каналы для процесса:

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

Это похоже на работу.

P.Péter
источник