web-dev-qa-db-fra.com

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

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

Sudo dhclient $wifi || otherFunction

Le problème est lorsque dhclient échoue, il se bloque simplement au lieu de lancer une erreur.

Comment puis-je réécrire ce qui précède pour que dhclient soit tué et otherFunction soit appelé si dhclient ne se termine pas dans 60 secondes?

13
Philip Kirkbride

Votre balise timeout donne tout:

Sudo timeout 60 dhclient $wifi || otherFunction

Un exemple:

Sudo timeout 3 sleep 5 || echo finished early

Celui-ci utilise l'utilitaire timeout fourni par le paquet GNU coreutils sous Linux.

13
Jeff Schaller

Utilisez le timeout emballé comme gtimeout avec le port coreutils dans brew :

brew install coreutils
gtimeout --help

Cela fonctionnera avec /usr/local/bin dans votre PATH. Si vous souhaitez utiliser timeout comme initialement nommé, ajoutez /usr/local/opt/coreutils/libexec/gnubin à votre PATH.

2
Garth Kidd

Utilisez timeout .

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
2
Matt Clark