Bash si el comando no termina en X tiempo?

13

Estoy tratando de ejecutar algo como:

sudo dhclient $wifi || otherFunction

El problema es cuando dhclientfalla, simplemente se cuelga en lugar de arrojar un error.

¿Cómo puedo volver a escribir lo anterior para que dhclientse elimine y otherFunctionse llame si dhclientno termina en 60 segundos?

Philip Kirkbride
fuente

Respuestas:

13

Su etiqueta de lo delata todo:

sudo timeout 60 dhclient $wifi || otherFunction

Un ejemplo:

sudo timeout 3 sleep 5 || echo finished early

Esto usa la utilidad de tiempo de espera proporcionada por el paquete GNU coreutils en Linux.

Jeff Schaller
fuente
2
lamentablemente no funciona en MacOS
Alexander Mills
timeoutpara MacOS: stackoverflow.com/a/21118126/451480
Blaise
Si desea verificar específicamente la timeouteliminación del comando (en lugar de que el comando falle por otras razones), verifique el estado de salida 124.
muru
2

Uso timeout.

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
Matt Clark
fuente
1
lamentablemente no funciona en MacOS
Alexander Mills
2

Use el timeoutempaquetado como gtimeoutcon el coreutilspuerto en brew:

brew install coreutils
gtimeout --help

Eso funcionará /usr/local/binen tu PATH. Si desea utilizar el timeoutnombre original, agregue /usr/local/opt/coreutils/libexec/gnubina su PATH.

Garth Kidd
fuente