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


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
    Це також працює, але вимірює лише процесорний час, тому сповільнення через I / O (наприклад, тим, що компресія гірша, і потрібно більше зчитувати з диска більше байтів) не вимірюється.

  3. Створення менших тестових файлів.
    Це може бути зрозуміло, і це може бути найкращим рішенням. Однак це створює безліч тимчасових файлів.


6
Коли я читав "ламання труб та туалету", спочатку думав, що у вас проблеми з водопровідом!
dr01

Відповіді:


21

Ви можете розмістити команду timeout у нижній частині і зробити її успішною:

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

3
Зробити невдалу команду вдалою? О, це виглядає так лихо: D
Ератьєль

17
@Erathiel Хочете посміхнутися, будучи злим? Спробуйте це (це еквівалентно вище):(timeout 10 <command> || :) | wc -c
Марко,

1
Я спробував скористатися нижньою оболонкою, але не думав про те, щоб зробити це успішним. Відмінно!
P.Péter

2

Одразу після публікації у мене з’явилася думка використовувати названі труби для цього процесу:

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

Це, здається, працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.