Solusi 1:
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; segera setelah berhasil, loop berakhir. Badan loop kosong, dengan perintah null ":
" digunakan untuk mencegah kesalahan sintaksis.
Pembaruan:Saya memikirkan cara untuk membuat Control-C keluar dari loop ping dengan bersih. Ini akan menjalankan loop di latar belakang, menjebak sinyal interupsi (Control-C), dan menghentikan 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"
Ini agak berputar-putar, tetapi jika Anda ingin loop dapat dibatalkan, lakukan triknya.
Solusi 2:
Saya tahu pertanyaannya sudah lama ... dan secara khusus menanyakan tentang ping
, tetapi saya ingin membagikan solusi saya.
Saya menggunakan ini saat me-reboot host untuk mengetahui kapan saya bisa SSH kembali ke mereka lagi. (Sejak ping
akan merespons selama beberapa detik sebelum sshd
dimulai.)
until nc -vzw 2 $host 22; do sleep 2; done
Solusi 3:
Anda dapat melakukan perulangan, mengirim satu ping dan bergantung pada status, hentikan perulangan, misalnya (bash):
while true; do ping -c1 www.google.com > /dev/null && break; done
Menempatkan ini di suatu tempat di skrip Anda akan diblokir, hingga www.google.com
dapat di-ping.
Solusi 4:
Ping host target sekali. Periksa apakah ping berhasil (nilai pengembalian ping adalah nol). Jika tuan rumah tidak hidup, ping lagi.
Kode berikut dapat disimpan sebagai file dan dipanggil dengan nama host sebagai argumen, atau dihapus dari baris pertama dan terakhir dan digunakan sebagai fungsi dalam skrip yang ada (nama host waitForHost).
Kode tidak mengevaluasi penyebab kegagalan jika ping tidak menghasilkan respons, sehingga berulang selamanya jika host tidak ada. Halaman manual BSD saya mencantumkan arti dari setiap nilai pengembalian, sedangkan linux tidak, jadi saya kira ini mungkin tidak portabel, itu sebabnya saya meninggalkannya.
#!/bin/bash
PING=`which ping`
function waitForHost
{
if [ -n "$1" ];
then
waitForHost1 $1;
else
echo "waitForHost: Hostname argument expected"
fi
}
function waitForHost1
{
reachable=0;
while [ $reachable -eq 0 ];
do
$PING -q -c 1 $1
if [ "$?" -eq 0 ];
then
reachable=1
fi
done
sleep 5
}
waitForHost $1
Solusi 5:
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done
Anda dapat menghapus sleep 1, ini hanya di sini untuk mencegah masalah banjir jika host dapat dijangkau tetapi ping tidak akan keluar dengan kode 0.