Убейте процесс, если он успокоится в течение определенного времени

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

2 Solutions collect form web for “Убейте процесс, если он успокоится в течение определенного времени”

С помощью zsh вы можете:

 zmodload zsh/system coproc your-command while :; do sysread -t 10 -o 1 <&p && continue if (( $? == 4 )); then echo "Timeout" >&2 kill $! fi break done 

Идея состоит в использовании опции -t для sysread для чтения с выхода your-command с таймаутом.

Обратите внимание, что он выводит your-command на канал. Возможно, your-command запускает буферизацию своего вывода, когда она не переходит на терминал, и в этом случае вы можете обнаружить, что она ничего не выводит через какое-то время, а только из-за этой буферизации, а не потому, что она как-то висела ,

Вы можете обойти это, используя stdbuf -oL your-command для восстановления буферизации строк (если ваша команда использует stdio) или использовать zpty вместо coproc для подделки вывода терминала.

При использовании bash вам придется полагаться на timeout dd и GNU, если он доступен:

 coproc your-command while :; do timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue if (($? == 124)); then echo Timeout >&2 kill "$!" fi done 

Вместо coproc вы также можете использовать замену процесса:

 while :; do timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue if (($? == 124)); then echo Timeout >&2 kill "$!" fi done 3< <(your-command) 

(это не будет работать в zsh или ksh93 потому что $! не содержит pid your-command там).

Я перенаправлял STDOUT к файлу, а затем использовал timestamp-тестирование monit для перезапуска процесса, если mtime файла больше порога.

  • Почему задания не убиваются при выходе из системы при выполнении с помощью «> / dev / null 2> & 1 &"?
  • Команда для вывода содержимого файла в stdout?
  • Динамический ~ / .ssh / config
  • Как перенаправить stdout в файл и прочитать из того же файла одновременно с другой задачей?
  • Только выходные результаты grep
  • Будет ли вывод вывода вывода фонового процесса в качестве входного сигнала stdin переднего плана?
  • Есть ли команда типа «tee», которая ограничивает размер файла и обрабатывает выходной файл как очередь с фиксированным размером?
  • Предполагаемое поведение stdbuf для подпроцессов
  • Как команда может иметь более одного выхода?
  • Показать скользящее окно вывода из программы
  • Обертка скрипта оболочки с тройником
  • Экран GNU: печать отдельного сеанса на стандартный вывод
  • Interesting Posts

    Сценарий Bash для перечисления элементов в каталоге по размеру

    Установить службу systemd для запуска после монтирования fstab

    В nixos, как правильно настроить tmux?

    Изменение основного GID по умолчанию для каждого сеанса входа в систему

    Как сообщить xrandr, чтобы моя мышь перемещалась между мониторами?

    Как сохранить последние 50 строк в файле журнала

    Неправильный пароль при использовании SSH с открытым / закрытым ключом

    Перемещение файлов, измененных после определенной даты

    Во время загрузки «Ожидание / dev для полного заполнения» заставляет перезагружать

    Каков приблизительный масштаб данных, который будет использовать сессия ssh? (Без обмена файлами)

    Я не могу устанавливать новые пакеты и не могу обновлять и обновлять

    Может ли ОС влиять на скорость USB?

    измеритель скорости трубы с машиносчитываемым выходом

    Результаты поиска для '* .squashfs' для unsquashfs

    Как получить имя столбца с определенной строкой?

    Linux и Unix - лучшая ОС в мире.