Изменение проверки маяка на состояние соединения во всех группах портов было критически важным компонентом для получения DUP! остановиться. Это также исправило многие другие странные сетевые события в нашей среде. Никогда не мог зафиксировать эти странные события, пока мы не добавили больше хостов, после чего виртуальные машины начали терять соединения. Это то, что привело нас к этой настройке.
timeout
не является встроенной/функцией оболочки bash
или любой другой оболочки, если это имеет значение (, за исключением случаев, когда вы хотите рассмотреть busybox sh, где команды busybox можно рассматривать как встроенные в оболочку ).
timeout
является нестандартной -автономной утилитой, для которой существует несколько часто несовместимых реализаций (также существуют timelimit
утилиты с той же функцией ).
В:
timeout 10 sudo slowcommand
Текущие версии реализации GNU утилиты timeout
(из GNU coreutils, опять же отличной от оболочки GNU, bash
), запустите sudo slowcommand
и отправьте команду SIGTERM своей собственной группе процессов, если sudo
не завершился в течение 10 секунд.
Однако запущенный процесс sudo
изменил идентификатор пользователя, и процесс, который sudo
породил для запуска slowcommand
, также будет работать с другим uid, так что даже если оба процесса будут находиться в той же группе процессов, что и что работающие timeout
, timeout
не будут иметь права посылать им сигналы.
Это можно обойти. Вы можете сделать так, чтобы ядро отправляло некоторые сигналы вместо какого-нибудь непривилегированного процесса, подобного запущенному timeout
. Например, вы могли бы отправить:
SIGPIPE, если slowcommand
пишет в закрытый канал:
sudo slowcommand | timeout 10 cat
приведет к отправке SIGPIPE на slowcommand
, если он запишет что-то в стандартный вывод через 10 секунд.
(кстати, здесь,cat
, sudo
и slowcommand
будут работать в одной группе процессов, так что это то же самое, что иtimeout 10 sudo slowcommand | cat
).
SIGXCPU, если slowcommand
использует больше назначенного лимита процессорного времени:
(ulimit -t 10; exec sudo slowcommand)
Приводит к уничтожению slowcommand
, если он использует 10 секунд процессорного времени.
SIGHUP, если терминал зависает и sudo
не является лидером сеанса:
timeout 10 script -qfc 'sudo slowcommand; exit' /dev/null
(здесь предполагается util-linux
скрипт)
SIGINT/SIGQUIT. Вы также можете использовать такие вещи, как expect
/ zpty
/ script
/ screen
, чтобы имитировать терминал и отправить символ ^C
через 10 секунд, чтобы SIGINT был отправлен в группу процессов переднего плана этого терминала.