Bash jika perintah tidak selesai dalam waktu X?

12

Saya mencoba menjalankan sesuatu seperti:

sudo dhclient $wifi || otherFunction

Masalahnya adalah ketika dhclientgagal itu hanya hang bukannya melempar kesalahan.

Bagaimana saya bisa menulis ulang di atas sehingga dhclientterbunuh dan otherFunctiondipanggil jika dhclienttidak selesai dalam 60 detik?

Philip Kirkbride
sumber

Jawaban:

12

Tag Anda memberikan semuanya:

sudo timeout 60 dhclient $wifi || otherFunction

Sebuah contoh:

sudo timeout 3 sleep 5 || echo finished early

Ini menggunakan utilitas batas waktu yang disediakan oleh paket GNU coreutils di Linux.

Jeff Schaller
sumber
2
sayangnya tidak bekerja pada MacOS
Alexander Mills
timeoutuntuk MacOS: stackoverflow.com/a/21118126/451480
Blaise
Jika Anda ingin memeriksa secara khusus untuk timeoutmembunuh perintah (yang bertentangan dengan perintah gagal karena alasan lain), periksa status keluar 124.
muru
2

Gunakan timeout.

timeout 2 sleep 1
echo $?
0

timeout 1 sleep 2
echo $?
124
Matt Clark
sumber
1
sayangnya tidak bekerja pada MacOS
Alexander Mills
2

Gunakan paket timeoutseperti gtimeoutpada coreutilsport di brew:

brew install coreutils
gtimeout --help

Itu akan bekerja dengan /usr/local/binAnda PATH. Jika Anda ingin menggunakan timeoutseperti aslinya, tambahkan /usr/local/opt/coreutils/libexec/gnubinke PATH.

Garth Kidd
sumber