Bash, wenn der Befehl nicht in X-Zeit beendet wird?

12

Ich versuche so etwas wie:

sudo dhclient $wifi || otherFunction

Das Problem ist, wenn es dhclientfehlschlägt, hängt es nur, anstatt einen Fehler zu werfen.

Wie kann ich das oben Gesagte umschreiben, damit dhclientes getötet und otherFunctionaufgerufen wird, wenn dhclientes nicht in 60 Sekunden fertig ist?

Philip Kirkbride
quelle

Antworten:

12

Ihr Tag verrät alles:

sudo timeout 60 dhclient $wifi || otherFunction

Ein Beispiel:

sudo timeout 3 sleep 5 || echo finished early

Dies verwendet das Timeout-Dienstprogramm, das vom GNU-Paket coreutils unter Linux bereitgestellt wird.

Jeff Schaller
quelle
2
funktioniert unter MacOS leider nicht
Alexander Mills
timeoutfür MacOS: stackoverflow.com/a/21118126/451480
Blaise
Wenn Sie speziell prüfen möchten, ob timeoutder Befehl beendet wurde (im Gegensatz dazu, dass der Befehl aus anderen Gründen fehlschlägt), prüfen Sie, ob der Exit-Status 124
vorliegt.
2

Verwenden Sie timeout.

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
Matt Clark
quelle
1
funktioniert unter MacOS leider nicht
Alexander Mills
2

Verwenden Sie die timeoutverpackte wie gtimeoutmit dem coreutilsPort in brew:

brew install coreutils
gtimeout --help

Das klappt mit /usr/local/bin dir PATH. Wenn Sie timeoutwie ursprünglich benannt verwenden möchten , fügen Sie /usr/local/opt/coreutils/libexec/gnubinIhrer hinzu PATH.

Garth Kidd
quelle