Код
Сохраните это как tkill
(сделайте его исполняемым и настройте, PATH
если необходимо):
#!/bin/bash _terminate_children() { trap "exit 143" SIGTERM && kill -- -$$ } trap _terminate_children SIGINT SIGTERM tout="$1" shift eval $@ | tee >(while :; do read -t "$tout" case $? in 0) : ;; 1) break ;; *) _terminate_children ;; esac done) exit $
Основное использование
tkill 30 some_command
Первый аргумент ( 30
здесь) - время ожидания в секундах.
Заметки
tkill
ожидаетsome_command
генерировать текстовый (не двоичный) вывод.tkill
зондыstdout
данной команды. Чтобы включитьstderr
перенаправление, как в последнем расширенном примере ниже.
Расширенное использование
Это действительные примеры:
tkill 9 foo -option value tkill 9 "foo -option value" # equivalent to the above tkill 5 "foo | bar" tkill 5 'foo | bar' tkill 5 'foo | bar | baz' # tkill monitors baz tkill 5 'foo | bar' | baz # baz reads from tkill tkill 3 "foo; bar" tkill 6 "foo && bar || baz" tkill 7 "some_command 2>&1"
Используйте синтаксис Bash в этих цитатах.
Статус выхода
- Если
some_command
выход сам по себе, то его выходной статус будет повторно использован как выходной статусtkill
;tkill 5 true
возвращается0
;tkill 5 false
возвращается1
;tkill 5 "true; false"
возвращается1
. - Если указанный тайм-аут истекает или
tkill
прерывается,SIGINT
илиSIGTERM
тогда статус выхода будет143
.
Фрагменты кода объяснены
eval
делает возможными расширенные примеры.tee
позволяет нам анализироватьstdin
, передавая его копиюstdout
.read -t
отвечает за применение тайм-аута, его статус выхода используется для определения того, что делать дальше.- Команды, которые отслеживаются, убиваются при необходимости с этим решением .
- С помощью этого решения можно получить статус выхода отслеживаемой команды .