Как использовать функцию тайм-аута bash для команд, требующих sudo?

Изменение проверки маяка на состояние соединения во всех группах портов было критически важным компонентом для получения DUP! остановиться. Это также исправило многие другие странные сетевые события в нашей среде. Никогда не мог зафиксировать эти странные события, пока мы не добавили больше хостов, после чего виртуальные машины начали терять соединения. Это то, что привело нас к этой настройке.

1
16.11.2020, 17:20
1 ответ

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 был отправлен в группу процессов переднего плана этого терминала.

6
18.03.2021, 22:49

Теги

Похожие вопросы