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

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

  • Показать скользящее окно вывода из программы
  • Bash, если скрипт вызывается из терминала echo stdout в терминал, если из cron не выводит эхо-сигнал
  • vim: Синтаксис синтаксиса с помощью аргумента командной строки
  • Как я могу получить версию vsftpd в переменной оболочки?
  • Предполагаемое поведение stdbuf для подпроцессов
  • Превращение стандартного вывода в одну команду
  • Неудачное решение от «Как перенаправить stdout и stderr в файл и отобразить stderr для консоли»
  • Запись строк в файл с меньшего количества
  • 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 файла больше порога.

    Interesting Posts

    Как исключить строки, которые дали столбцы?

    Нужна помощь в восстановлении раздела FAT32 из нераспределенной части внешнего HD

    Перенаправление stdout в терминал и файл без использования канала?

    Почему Вим иногда показывает эти странные персонажи?

    Nginx + PHP + FTP – проблема с правами пользователя

    Является ли cat единственной надежной командой, которая может считывать данные из последовательного интерфейса?

    Изменено имя пользователя – не удалось обновить файл полномочий ICE

    Clone установлена ​​с использованием аппаратной синхронизации RAID 0 + 1

    Прокрутка вывода команды без временного файла

    Как я могу отправлять уведомления в свою строку состояния?

    Как я могу регистрировать все сеансы экрана

    Действительно легкий вес для VM без расширений

    Есть ли способ отправить команду из удаленного сеанса ssh на ваш локальный компьютер?

    Обновление OpenSSL на сервере SLES11

    Почему я получаю ошибку 403 при посещении / javascript на моем сайте?

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