Убить процесс, если он затихает в течение определенного времени


9

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

Ответы:


8

С помощью 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вам придется положиться ddи GNU, timeoutесли доступно:

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там).


1
Привет! Спасибо, возможно, вы могли бы прокомментировать это, чтобы я мог понять, что это делает?
Бенджо

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.