Bash se o comando não terminar em X tempo?

12

Estou tentando executar algo como:

sudo dhclient $wifi || otherFunction

O problema é que quando dhclientfalha, ele simplesmente trava em vez de gerar um erro.

Como posso reescrever o que dhclientfoi otherFunctiondito acima para ser morto e ser chamado se dhclientnão terminar em 60 segundos?

Philip Kirkbride
fonte

Respostas:

12

Sua tag de revela tudo:

sudo timeout 60 dhclient $wifi || otherFunction

Um exemplo:

sudo timeout 3 sleep 5 || echo finished early

Isso usa o utilitário timeout fornecido pelo pacote GNU coreutils no Linux.

Jeff Schaller
fonte
2
infelizmente não funciona no MacOS
Alexander Mills
timeoutpara MacOS: stackoverflow.com/a/21118126/451480
Blaise
Se você quiser verificar especificamente para timeoutmatar o comando (em oposição ao comando falhar por outros motivos), para verificar o status de saída 124.
Muru
2

Use timeout.

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
Matt Clark
fonte
1
infelizmente não funciona no MacOS
Alexander Mills
2

Use o timeoutpacote como gtimeoutna coreutilsporta em brew:

brew install coreutils
gtimeout --help

Isso funcionará com o /usr/local/binseu PATH. Se você deseja usar timeoutcomo nomeado originalmente, adicione /usr/local/opt/coreutils/libexec/gnubinao seu PATH.

Garth Kidd
fonte