С помощью 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
там).
Я перенаправляю STDOUT в файл, а затем использую тестирование метки времени monit, чтобы перезапустить процесс, если mtime файла превышает пороговое значение.
источник