จะสร้าง loop ใน bash ที่รอให้เว็บเซิร์ฟเวอร์ตอบกลับได้อย่างไร?


106

จะสร้าง loop ใน bash ที่รอให้เว็บเซิร์ฟเวอร์ตอบกลับได้อย่างไร?

ควรพิมพ์ "." ทุกๆ 10 วินาทีหรือมากกว่านั้นและรอจนกว่าเซิร์ฟเวอร์จะเริ่มตอบสนอง

อัปเดตรหัสนี้จะทดสอบว่าฉันได้รับการตอบสนองที่ดีจากเซิร์ฟเวอร์หรือไม่

ถ้า curl --output / dev / null --silent --head --fail "$ url"; แล้ว
  echo "มี URL อยู่: $ url"
อื่น
  echo "ไม่มี URL: $ url"
fi

คุณสามารถระบุเพิ่มเติมเกี่ยวกับวิธีที่คุณรอให้เซิร์ฟเวอร์ตอบกลับได้หรือไม่?
chepner

ฉันจะพิจารณาว่าเซิร์ฟเวอร์ไม่พร้อมตราบใดที่เซิร์ฟเวอร์ไม่ตอบกลับหรือตอบกลับด้วยสิ่งที่แตกต่างจากการตอบกลับ 200 ครั้ง
sorin

คำตอบ:


177

เมื่อรวมคำถามกับคำตอบของ chepner สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

10
การใช้ backticks `` เป็นล้าสมัย ใช้$( )แทน
Serge Stroobandt

6
จะเป็นส่วนขยายที่ดีในการให้เวลารอสูงสุดก่อนที่จะยอมแพ้
tkruse

ทำไมคุณถึงต้องการ--head?
พจนานุกรม

3
@lexicore เนื่องจากเนื้อหาไม่น่าสนใจสำหรับคำสั่งนี้เราจึงขอเฉพาะส่วนหัวเท่านั้น (แม้ว่าคุณจะรวมตรรกะเพื่อตรวจสอบข้อมูลเพิ่มเติมเกี่ยวกับสถานะของเซิร์ฟเวอร์ได้) การออกไป--headจะไม่เปลี่ยนแปลงอะไร แต่คุณสามารถทำได้ถ้าคุณต้องการใช้ตรรกะบางอย่างกับเนื้อหาการตอบกลับ (เช่น status.html)
Thomas Ferris Nicolaisen

1
ผมมีกรณีเฉพาะที่ใช้กลับมาเสมอ--head 405ต้องลบออกเพื่อให้ใช้งานได้
Ron Harlev

43

ฉันต้องการ จำกัด จำนวนครั้งสูงสุด จากคำตอบที่ยอมรับของ Thomas ฉันทำสิ่งนี้:

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

ฉันขอแนะนำให้เพิ่ม--max-time 5หากด้วยเหตุผลบางประการที่ขอให้ลิงก์หมดเวลา
Enigo

16

HTTping เป็นสิ่งที่ดีสำหรับสิ่งนี้ เรียบง่ายสะอาดเงียบ

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

while / until etc เป็นคำนำหน้าส่วนบุคคล


2
ในความคิดที่สองตลอดไปเป็นเวลานาน ... for i in ก.ย. 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge


0

ปริศนาที่น่าสนใจ หากคุณไม่มีการเข้าถึงหรือ async api กับไคลเอนต์ของคุณคุณสามารถลอง grepping tcp sockets ดังนี้:

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

แต่นั่นเป็นการรอที่วุ่นวายโดยมีช่วงเวลา 1 วินาที คุณอาจต้องการความละเอียดมากกว่านั้น นอกจากนี้ยังเป็นทั่วโลก หากมีการเชื่อมต่ออื่นกับเซิร์ฟเวอร์นั้นผลลัพธ์ของคุณจะไม่ถูกต้อง


-1

หากคุณต้องการตรวจสอบว่าเซิร์ฟเวอร์พร้อมใช้งานหรือไม่สาเหตุกำลังเริ่มต้นใหม่หรืออย่างอื่นคุณสามารถลองสร้าง wget ไปยังเซิร์ฟเวอร์และแยกวิเคราะห์การตอบสนองหรือข้อผิดพลาดหากคุณได้รับ 200 หรือ 404 เซิร์ฟเวอร์ก็พร้อมใช้งานคุณ สามารถเปลี่ยนการหมดเวลา wget ด้วย --timeout = วินาทีคุณสามารถตั้งค่าการหมดเวลาเป็น 10 วินาทีและทำวนซ้ำจนกว่า grep เหนือการตอบสนองจะมีผล

ฉันไม่รู้ว่านี่คือสิ่งที่คุณกำลังค้นหาหรือคุณต้องการรหัสทุบตีจริงๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.