Làm thế nào để tạo vòng lặp trong bash đang chờ máy chủ web phản hồi?


103

Làm thế nào để tạo vòng lặp trong bash đang chờ máy chủ web phản hồi?

Nó sẽ in một "." cứ sau 10 giây hoặc lâu hơn và đợi cho đến khi máy chủ bắt đầu phản hồi.

Cập nhật, mã này kiểm tra nếu tôi nhận được phản hồi tốt từ máy chủ.

if curl --output / dev / null --silent --head --fail "$ url"; sau đó
  echo "URL tồn tại: $ url"
khác
  echo "URL không tồn tại: $ url"
fi

Bạn có thể nói cụ thể hơn là bạn đang chờ máy chủ phản hồi như thế nào?
chepner

Tôi sẽ xem xét rằng máy chủ chưa sẵn sàng, miễn là nó không trả lời hoặc nó trả lời với một cái gì đó khác với 200 phản hồi.
sorin

Câu trả lời:


169

Kết hợp câu hỏi với câu trả lời của chepner, điều này có hiệu quả với tôi:

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

10
Việc sử dụng backticks '' đã lỗi thời . Sử dụng $( )thay thế.
Serge Stroobandt

6
Sẽ là một phần mở rộng tuyệt vời để cho phép một thời gian tối đa chờ đợi trước khi từ bỏ
tkruse

Tại sao bạn cần một --head?
lexicore

3
@lexicore Vì phần nội dung không thú vị cho lệnh này, chúng tôi chỉ yêu cầu phần đầu (mặc dù bạn có thể bao gồm logic để kiểm tra thêm nội dung về trạng thái của máy chủ). Bỏ ra ngoài --headsẽ không thay đổi bất cứ điều gì, nhưng bạn có thể nếu bạn muốn thực hiện một số logic về nội dung phản hồi (như status.html).
Thomas Ferris Nicolaisen

1
Tôi đã gặp một trường hợp cụ thể trong đó việc sử dụng --headluôn trả về 405. Phải loại bỏ nó để làm cho nó hoạt động
Ron Harlev

38

Tôi muốn giới hạn số lần thử tối đa. Dựa trên câu trả lời được chấp nhận của Thomas, tôi đã đưa ra điều này:

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

Tôi đề nghị để thêm --max-time 5nếu vì một lý do yêu cầu thời gian liên kết ra
Enigo

16

httping là tốt cho điều này. đơn giản, sạch sẽ, yên tĩnh.

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

trong khi / cho đến khi vv là một pref cá nhân.


2
Suy nghĩ thứ hai, mãi mãi là một thời gian dài ... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge

2

Việc sử dụng backticks ` `lỗi thời . Sử dụng $( )thay thế:

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

0

Câu đố thú vị. Nếu bạn không có quyền truy cập hoặc api không đồng bộ với ứng dụng khách của mình, bạn có thể thử nạp các ổ cắm tcp của mình như sau:

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

Nhưng đó là một sự chờ đợi bận rộn với khoảng thời gian 1 giây. Bạn có thể muốn có nhiều độ phân giải hơn thế. Ngoài ra điều này là toàn cầu. Nếu một kết nối khác được thực hiện với máy chủ đó, kết quả của bạn không hợp lệ.


-1

Nếu bạn cần kiểm tra xem máy chủ có khả dụng hay không, nguyên nhân là do khởi động lại hoặc điều gì khác, bạn có thể thử tạo một wget đến máy chủ và phân tích cú pháp phản hồi hoặc lỗi, nếu bạn nhận được 200 hoặc thậm chí là 404 thì máy chủ đã hoạt động, bạn có thể thay đổi thời gian chờ của chương trình bằng --timeout = seconds, Bạn có thể đặt thời gian chờ thành 10 giây và thực hiện một vòng lặp cho đến khi có kết quả.

Tôi không biết đây có phải là những gì bạn đang tìm kiếm hay thực sự bạn cần mã bash.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.