Bash'de bir web sunucusunun yanıt vermesini bekleyen bir döngü nasıl oluşturulur?


106

Bash'de bir web sunucusunun yanıt vermesini bekleyen bir döngü nasıl oluşturulur?

Bir "." Yazdırmalıdır. her 10 saniyede bir ve sunucu yanıt vermeye başlayana kadar bekleyin.

Güncelleme, bu kod sunucudan iyi bir yanıt alıp almadığımı test eder.

curl --output / dev / null --silent --head --fail ise "$ url"; sonra
  echo "URL var: $ url"
Başka
  echo "URL yok: $ url"
fi

Sunucunun yanıt vermesini nasıl beklediğiniz konusunda daha net olabilir misiniz?
chepner

Yanıt vermediği veya 200 yanıtından farklı bir yanıt verdiği sürece sunucunun hazır olmadığını düşüneceğim.
sorin

Yanıtlar:


177

Soruyu chepner'ın cevabı ile birleştirdiğimde, bu benim için çalıştı:

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

10
Ters işaretlerin kullanımı `` modası geçmiş . $( )Bunun yerine kullanın .
Serge Stroobandt

6
Vazgeçmeden önce maksimum bekleme süresine izin vermek için harika bir uzantı olur
tkruse

Neden a ihtiyacınız var --head?
lexicore

3
@lexicore Gövde bu komut için ilginç olmadığından, biz sadece kafayı istiyoruz (ancak sunucunun durumu hakkında daha fazla şey kontrol etmek için mantığı dahil edebilirsiniz). Dışarıda bırakmak --headhiçbir şeyi değiştirmez, ancak yanıt içeriği üzerinde biraz mantık uygulamak isterseniz (status.html gibi) yapabilirsiniz.
Thomas Ferris Nicolaisen

1
Kullanmanın --headher zaman geri döndüğü belirli bir durum vardı 405. Çalışması için çıkarmak zorunda kaldı
Ron Harlev

43

Maksimum deneme sayısını sınırlamak istedim. Thomas'ın kabul ettiği cevaba dayanarak şunu yaptım:

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

Ben eklemek önermek --max-time 5olmadığını bağlantı süreleri istenen bazı nedenlerden dolayı
Enigo

16

HTTping bunun için güzel. basit, temiz, sessiz.

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

while / until etc kişisel bir tercih.


2
Tekrar düşündüm de, sonsuza kadar uzun bir zamandır ... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Kenar

2

Ters işaretlerin ` `kullanımı eski . $( )Bunun yerine kullanın :

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

0

İlginç bir bulmaca. İstemcinizle erişiminiz veya zaman uyumsuz api'niz yoksa, tcp soketlerinizi şu şekilde büyütmeyi deneyebilirsiniz:

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

Ama bu 1 saniyelik aralıklarla yoğun bir bekleme. Muhtemelen bundan daha fazla çözünürlük istiyorsun. Ayrıca bu küreseldir. Bu sunucuya başka bir bağlantı yapılırsa sonuçlarınız geçersizdir.


-1

Sunucunun kullanılabilir olup olmadığını kontrol etmeniz gerekiyorsa, neden yeniden başlatılıyor veya başka bir şey varsa, sunucuya bir wget oluşturmayı deneyebilir ve yanıtı veya hatayı ayrıştırabilirsiniz, eğer bir 200 veya hatta bir 404 alırsanız sunucu çalışıyorsa, siz wget zaman aşımını --timeout = saniye ile değiştirebilir, zaman aşımını 10 saniyeye ayarlayabilir ve yanıt üzerindeki grep bir sonuç alana kadar bir döngü oluşturabilirsiniz.

Aradığınız şeyin bu mu yoksa gerçekten bash koduna mı ihtiyacınız olduğunu bilmiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.