Bash, если команда не заканчивается в X раз?

13

Я пытаюсь запустить что-то вроде:

sudo dhclient $wifi || otherFunction

Проблема в том, что когда происходит dhclientсбой, он просто зависает, а не выдает ошибку.

Как я могу переписать вышесказанное, чтобы dhclientего убили и otherFunctionвызвали, если dhclientон не закончил через 60 секунд?

Филип Киркбрайд
источник

Ответы:

13

Ваш выдает все это:

sudo timeout 60 dhclient $wifi || otherFunction

Пример:

sudo timeout 3 sleep 5 || echo finished early

Для этого используется утилита тайм-аута, предоставляемая пакетом GNU coreutils в Linux.

Джефф Шаллер
источник
2
к сожалению, не работает на MacOS
Александр Миллс
timeoutдля MacOS: stackoverflow.com/a/21118126/451480
Blaise
Если вы хотите проверить специально для timeoutуничтожения команды (в отличие от сбоя команды по другим причинам), проверьте статус выхода 124.
Муру
2

Использование timeout.

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
Мэтт Кларк
источник
1
к сожалению, не работает на MacOS
Александр Миллс
2

Используйте timeoutупакованный как gtimeoutс coreutilsпортом в brew:

brew install coreutils
gtimeout --help

Это будет работать /usr/local/binв вашем PATH. Если вы хотите использовать timeoutкак первоначально названный, добавьте /usr/local/opt/coreutils/libexec/gnubinк своему PATH.

Гарт Кидд
источник