Bash si la commande ne se termine pas dans le temps X?

13

J'essaie d'exécuter quelque chose comme:

sudo dhclient $wifi || otherFunction

Le problème est qu'en cas d' dhclientéchec, il se bloque simplement au lieu de lancer une erreur.

Comment puis-je réécrire ce qui précède afin qu'il dhclientsoit tué et otherFunctionsoit appelé si dhclientne se termine pas dans les 60 secondes?

Philip Kirkbride
la source

Réponses:

13

Votre étiquette de d' donne tout:

sudo timeout 60 dhclient $wifi || otherFunction

Un exemple:

sudo timeout 3 sleep 5 || echo finished early

Cela utilise l' utilitaire de délai d'attente fourni par le paquet GNU coreutils sous Linux.

Jeff Schaller
la source
2
ne fonctionne pas sur MacOS malheureusement
Alexander Mills
timeoutpour MacOS: stackoverflow.com/a/21118126/451480
Blaise
Si vous souhaitez vérifier spécifiquement la timeoutsuppression de la commande (par opposition à l'échec de la commande pour d'autres raisons), vérifiez l'état de sortie 124.
muru
2

Utilisez timeout.

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
Matt Clark
la source
1
ne fonctionne pas sur MacOS malheureusement
Alexander Mills
2

Utilisez l' timeoutemballage comme gtimeoutavec le coreutilsport dans brew:

brew install coreutils
gtimeout --help

Cela fonctionnera avec /usr/local/bindans votre PATH. Si vous souhaitez utiliser le timeoutnom d'origine, ajoutez-le /usr/local/opt/coreutils/libexec/gnubinà votre PATH.

Garth Kidd
la source