Bash, jeśli polecenie nie zakończy się w czasie X?

13

Próbuję uruchomić coś takiego:

sudo dhclient $wifi || otherFunction

Problem polega na tym, że gdy dhclientzawiedzie, po prostu zawiesza się zamiast generować błąd.

Jak mogę ponownie napisać powyższe, aby dhclientzostał zabity i otherFunctionzostaje wezwany, jeśli dhclientnie skończy się w ciągu 60 sekund?

Philip Kirkbride
źródło

Odpowiedzi:

13

Twój tag to wszystko:

sudo timeout 60 dhclient $wifi || otherFunction

Przykład:

sudo timeout 3 sleep 5 || echo finished early

Wykorzystuje to narzędzie timeout dostarczone przez pakiet GNU coreutils w systemie Linux.

Jeff Schaller
źródło
2
nie działa niestety na MacOS
Alexander Mills,
timeoutdla MacOS: stackoverflow.com/a/21118126/451480
Blaise
Jeśli chcesz sprawdzić, czy timeoutpolecenie nie zostało
zabite
2

Zastosowanie timeout.

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
Matt Clark
źródło
1
nie działa niestety na MacOS
Alexander Mills,
2

Użyj timeoutzapakowanego jak gtimeoutz coreutilsportem w brew:

brew install coreutils
gtimeout --help

To zadziała /usr/local/binw twoim PATH. Jeśli chcesz używać timeoutoryginalnie nazwanego, dodaj /usr/local/opt/coreutils/libexec/gnubindo swojego PATH.

Garth Kidd
źródło