Bagaimana cara membuat loop di bash yang menunggu tanggapan dari server web?

105

Bagaimana cara membuat loop di bash yang menunggu tanggapan dari server web?

Ini harus mencetak "." setiap 10 detik atau lebih, dan tunggu hingga server mulai merespons.

Perbarui, kode ini menguji apakah saya mendapat respons yang baik dari server.

jika curl --output / dev / null --silent --head --fail "$ url"; kemudian
  echo "URL ada: $ url"
lain
  echo "URL tidak ada: $ url"
fi
sorin
sumber
Bisakah Anda lebih spesifik tentang bagaimana Anda menunggu server merespons?
chepner
Saya akan menganggap bahwa server tidak siap, selama tidak membalas atau membalas dengan sesuatu yang berbeda dari 200 tanggapan.
sorin

Jawaban:

173

Menggabungkan pertanyaan dengan jawaban chepner, ini berhasil untuk saya:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done
Thomas Ferris Nicolaisen
sumber
10
Penggunaan backticks `` sudah ketinggalan zaman . Gunakan $( )sebagai gantinya.
Serge Stroobandt
6
Akan menjadi perpanjangan yang bagus untuk memungkinkan waktu tunggu maksimum sebelum menyerah
tkruse
Mengapa Anda membutuhkan --head?
lexicore
3
@lexicore Karena body tidak menarik untuk perintah ini, kami hanya meminta head (walaupun Anda dapat menyertakan logika untuk memeriksa lebih banyak hal tentang status server). Meninggalkan --headtidak akan mengubah apa pun, tetapi Anda dapat melakukannya jika Anda ingin menggunakan beberapa logika pada konten respons (seperti status.html).
Thomas Ferris Nicolaisen
1
Saya memiliki kasus khusus di mana penggunaan --headselalu kembali 405. Harus menghapusnya untuk membuatnya bekerja
Ron Harlev
38

Saya ingin membatasi jumlah percobaan maksimum. Berdasarkan jawaban yang diterima Thomas, saya membuat ini:

attempt_counter=0
max_attempts=5

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    if [ ${attempt_counter} -eq ${max_attempts} ];then
      echo "Max attempts reached"
      exit 1
    fi

    printf '.'
    attempt_counter=$(($attempt_counter+1))
    sleep 5
done
illagrenan
sumber
Saya menyarankan untuk menambahkan --max-time 5jika karena beberapa alasan waktu tautan yang diminta habis
Enigo
16

httping bagus untuk ini. sederhana, bersih, tenang.

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done

sementara / sampai dll adalah preferensi pribadi.

Bruce Edge
sumber
2
Dipikir-pikir, selamanya adalah waktu yang lama ... bagian for i in 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge
2

Penggunaan backticks ` `sudah usang . Gunakan $( )sebagai gantinya:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
  printf '.'
  sleep 5
done
Serge Stroobandt
sumber
0

Teka-teki yang menarik. Jika Anda tidak memiliki akses atau api async dengan klien Anda, Anda dapat mencoba grep soket tcp Anda seperti ini:

until grep '***IPV4 ADDRESS OF SERVER IN REVERSE HEX***' /proc/net/tcp
do
  printf '.'
  sleep 1
done

Tapi itu penantian sibuk dengan interval 1 detik. Anda mungkin menginginkan resolusi lebih dari itu. Ini juga global. Jika koneksi lain dibuat ke server itu, hasil Anda tidak valid.

BoeroBoy
sumber
-1

jika Anda perlu memeriksa apakah server tersedia, penyebab sedang restart atau yang lainnya, Anda dapat mencoba membuat wget ke server dan mengurai respons atau kesalahan, jika Anda mendapatkan 200 atau bahkan 404 server sudah habis, Anda dapat mengubah batas waktu wget dengan --timeout = detik, Anda dapat menyetel batas waktu ke 10 detik dan membuat putaran hingga grep di atas respons memberikan hasil.

saya tidak tahu apakah ini yang Anda cari atau benar-benar Anda memerlukan kode bash.

Menggumpal
sumber