Bash, jeśli polecenie nie ' t kończy się w czasie X?

Próbuję uruchomić coś takiego:

sudo dhclient $wifi || otherFunction 

Problem pojawia się, gdy dhclient kończy się niepowodzeniem, po prostu zawiesza się zamiast generować błąd.

Jak mogę przepisać powyższe, aby dhclient było zabity i otherFunction zostaje wywołany, jeśli dhclient nie zakończy się w 60 sekund?

Odpowiedź

Twój tag zapewnia wszystko:

sudo timeout 60 dhclient $wifi || otherFunction 

Przykład:

sudo timeout 3 sleep 5 || echo finished early 

Wykorzystywane jest narzędzie timeout udostępniony przez pakiet GNU coreutils w systemie Linux.

Komentarze

  • nie ' niestety działa na MacOS
  • timeout dla MacOS: stackoverflow.com/a/21118126/451480
  • Jeśli chcesz sprawdzić konkretnie pod kątem timeout zabijania e polecenie (w przeciwieństwie do polecenia, które zawiodło z innych powodów), sprawdź stan wyjścia 124.

Odpowiedź

Użyj timeout .

timeout 2 sleep 1 echo $? 0 timeout 1 sleep 2 echo $? 124 

Komentarze

  • nie ' niestety nie działa na MacOS

Odpowiedź

Użyj timeout spakowanego jako gtimeout z coreutils port w brew :

brew install coreutils gtimeout --help 

To „będzie działać z /usr/local/bin w Twoim PATH. Jeśli chcesz używać timeout zgodnie z pierwotną nazwą, dodaj /usr/local/opt/coreutils/libexec/gnubin do swojego PATH.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *