Câu trả lời:
Thử nghiệm tốt nhất để xem máy chủ có chấp nhận kết nối hay không là thử kết nối. Sử dụng máy khách thông thường cho bất kỳ giao thức nào mà máy chủ của bạn nói và thử lệnh no-op.
Nếu bạn muốn một máy khách TCP hoặc UDP nhẹ, bạn có thể lái xe đơn giản từ hệ vỏ, hãy sử dụng netcat . Làm thế nào để lập trình một cuộc hội thoại phụ thuộc vào giao thức; nhiều giao thức có máy chủ đóng kết nối trên một đầu vào nhất định và sau đó netcat sẽ thoát.
while ! echo exit | nc localhost 13000; do sleep 10; done
Bạn cũng có thể yêu cầu netcat thoát sau khi thiết lập kết nối. Nó trả về 1 nếu không có kết nối và 0 nếu có vì vậy chúng tôi phủ nhận đầu ra của nó. Tùy thuộc vào phiên bản netcat của bạn, nó có thể hỗ trợ một hoặc cả hai lệnh sau:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Một cách tiếp cận khác là chờ quá trình máy chủ mở ổ cắm nghe.
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Nếu bạn đang dùng Mac OS, netstat sử dụng định dạng đầu ra hơi khác, vì vậy bạn sẽ muốn có thông tin sau:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
Hoặc bạn có thể muốn nhắm mục tiêu ID quy trình cụ thể:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
Tôi không thể nghĩ ra bất kỳ cách nào để phản ứng với quá trình bắt đầu lắng nghe ổ cắm (điều này sẽ tránh cách tiếp cận bỏ phiếu) khi sử dụng ptrace
.
nc -w 2 </dev/null >/dev/null
- nếu kết nối mất hơn 2 giây, nó hết thời gian và không thành công - rất hữu ích cho việc sử dụng của tôi.
nc -q 1 localhost 13000 </dev/null
trả về ngay lập tức nếu không có máy chủ nào nghe, nhưng nó trả về với mã lỗi, vì vậy vòng lặp làm cho nó ngủ và thử lại vài giây sau.
Nếu bạn có bash và coreutils (ví dụ như thời gian chờ, thời gian ngủ), nhưng không phải nc / lsof / netstat, bạn có thể sử dụng giải pháp này sử dụng ổ cắm bash ma thuật bash:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
Theo ví dụ trước với bash
ma thuật ổ cắm tcp, đây là phiên bản nâng cao chờ kết nối trong khoảng thời gian giới hạn.
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
Sự khác biệt là nếu kết nối không khả dụng trong thời gian 15s
, - nó sẽ không lặp lại mãi mà thoát khỏi mã lỗi.
Điều này rất hữu ích trong các tập lệnh init để chờ sẵn sàng / sẵn sàng dịch vụ sau khi khởi động.