Завершить конвейер, если данные не передаются в течение n секунд

Завершить конвейер, если данные не передаются в течение n секунд

У меня есть программа, которая некоторое время выводит данные на стандартный вывод, а затем продолжает работу, но больше никаких данных не выводит.

У меня есть конвейер, который берет этот вывод и обрабатывает его дальше, сохраняя вывод в файле. Однако, поскольку исходный процесс продолжает работать после того, как он заканчивает производить вывод, мне приходится завершать его вручную. Есть ли команда, которая остановит запущенную программу, если она не производит никакого вывода в течение некоторого количества секунд?

Я знаю о команде timeout, но похоже, что она работает на фиксированном таймауте. У меня нет надежного способа определить, как долго программное обеспечение будет продолжать выводить данные.

Пример:

Предположим, что у меня есть generate-dataто, что выглядит так и не может быть изменено. На самом деле, это часть скомпилированного программного обеспечения, которое я бы предпочел не изменять.

#! /usr/bin/env bash

for x in {1..5}; do
    echo $x
    sleep 1
done

while true; do sleep 1; done

В настоящее время я запускаю что-то вроде ./generate_data | grep '[2-4]' > output, что выдает нужный мне результат, но никогда не завершает работу.

Я хотел бы завершить работу конвейера, если generate_dataон ничего не выводит в течение 2 секунд.

решение1

Используйте команду read. Ключ -t — ваш друг. Подобно этому

(echo "we:re:e";sleep 2;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done

Выход:

 we
 re
(echo "we:re:e";sleep 1;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done

Выход:

we
re
e d
dd

Связанный контент