Penyederhanaan lebih lanjut dari jawaban Martynas:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
perhatikan bahwa ping itu sendiri digunakan sebagai tes loop; begitu berhasil, loop berakhir. Badan loop kosong, dengan perintah " :
" nol digunakan untuk mencegah kesalahan sintaks.
Pembaruan: Saya memikirkan cara untuk membuat Control-C keluar dari loop ping dengan bersih. Ini akan menjalankan loop di latar belakang, menjebak sinyal interrupt (Control-C), dan membunuh loop latar belakang jika terjadi:
ping_cancelled=false # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done & # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $! # Wait for the loop to exit, one way or another
trap - SIGINT # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"
Agak berputar-putar, tetapi jika Anda ingin loop dapat dibatalkan itu harus melakukan trik.
ping
akan menunggu 10 detik sebelum menyerah pada pingnya. Jika Anda ingin mengurangi itu menjadi 1 detik, Anda dapat menggunakannya-w1
.-W1
kill %1
membunuhnya.Anda dapat melakukan loop, mengirim satu ping dan tergantung pada status break loop, misalnya (bash):
Menempatkan ini di suatu tempat di skrip Anda akan diblokir, sampai
www.google.com
dapat diputuskan.sumber
while true
danbreak
merupakan solusi bersih, IMO.while true; do sleep 5; ping ...
Saya tahu pertanyaannya sudah lama ... dan secara khusus menanyakan
ping
, tetapi saya ingin membagikan solusi saya.Saya menggunakan ini ketika me-reboot host untuk mengetahui kapan saya bisa SSH kembali ke mereka lagi. (Karena
ping
akan merespons selama beberapa detik sebelumsshd
dimulai.)sumber
Ping host target sekali. Periksa apakah ping berhasil (nilai balik ping adalah nol). Jika host tidak hidup, ping lagi.
Kode berikut dapat disimpan sebagai file dan dipanggil dengan nama host sebagai argumen, atau dilucuti dari baris pertama dan terakhir dan digunakan sebagai fungsi dalam skrip yang ada (waitForHost hostname).
Kode tidak mengevaluasi penyebab kegagalan jika ping tidak menghasilkan respons, sehingga berulang selamanya jika host tidak ada. Manual BSD saya mencantumkan arti dari masing-masing nilai kembali, sedangkan yang linux tidak, jadi saya kira ini mungkin tidak portabel, itu sebabnya saya meninggalkannya.
sumber
Anda dapat menghapus sleep 1, itu hanya di sini untuk mencegah masalah banjir jika tuan rumah dapat dijangkau tetapi ping tidak akan keluar dengan kode 0.
sumber
Silakan lihat opsi yang baik di stackoverflow . Berikut ini contoh dalam bash, Anda harus mengulang kode berikut hingga mengembalikan hasil ping yang berhasil.
sumber
salah satu loop di atas juga dapat digunakan dengan fping daripada ping yang, IMO, lebih cocok untuk digunakan dalam skrip daripada ping itu sendiri. Lihat fping (1) untuk detailnya.
juga berguna untuk menguji apakah mesin sudah bangun sebelum melakukan sesuatu pada mereka. Contoh sederhana:
sumber
Ini akan mencoba beberapa kali.
Alih-alih menggema
$r
, Anda dapat mengujinya dan bertindak sesuai nilainya:sumber
Untuk menangani SIGINT dengan baik pada BSD ping.
sebagai fungsi
sumber
Saya telah menggunakan fungsi berikut. Saya suka karena saya bisa mengatakan itu untuk berhenti mencoba setelah beberapa saat:
Dapat digunakan seperti ini untuk meluncurkan sesuatu:
sumber
Secara umum saya ingin menunggu database atau server lain muncul, tetapi saya tidak ingin menunggu terlalu lama. Kode berikut menunggu selama 10 detik, kemudian menetapkan kode keluar jika server tidak muncul dalam batas waktu.
Jika server muncul sebelum batas waktu, loop akan dihubung pendek sehingga bit kode berikutnya dapat berjalan.
sumber
Peningkatan lebih lanjut untuk jawaban Gordon Davisson:
dengan '$ ()' di sekitarnya, sebuah subkulit dimulai dan oleh karena itu Anda dapat menggunakan Control-C untuk mengakhiri loop jika host tidak tersedia.
sumber