ฉันต้องการคำสั่งที่จะรอให้กระบวนการเริ่มยอมรับการร้องขอบนพอร์ตเฉพาะ
มีอะไรใน linux หรือเปล่า?
while (checkAlive -host localhost -port 13000 == false)
do some waiting
...
ฉันต้องการคำสั่งที่จะรอให้กระบวนการเริ่มยอมรับการร้องขอบนพอร์ตเฉพาะ
มีอะไรใน linux หรือเปล่า?
while (checkAlive -host localhost -port 13000 == false)
do some waiting
...
คำตอบ:
การทดสอบที่ดีที่สุดเพื่อดูว่าเซิร์ฟเวอร์ยอมรับการเชื่อมต่อหรือไม่คือลองเชื่อมต่อจริงหรือไม่ ใช้ไคลเอนต์ปกติสำหรับโปรโตคอลใดก็ตามที่เซิร์ฟเวอร์ของคุณพูดและลองใช้คำสั่ง no-op
หากคุณต้องการมีน้ำหนักเบา TCP หรือ UDP ลูกค้าคุณสามารถขับรถเพียงจากเปลือกใช้netcat วิธีตั้งโปรแกรมการสนทนาขึ้นอยู่กับโปรโตคอล โพรโทคอลจำนวนมากมีเซิร์ฟเวอร์ปิดการเชื่อมต่อในอินพุตที่แน่นอนและ netcat จะออกจาก
while ! echo exit | nc localhost 13000; do sleep 10; done
คุณยังสามารถบอก netcat ให้ออกหลังจากสร้างการเชื่อมต่อ มันจะคืนค่า 1 หากไม่มีการเชื่อมต่อและ 0 หากมีดังนั้นเราจึงลบล้างเอาต์พุต มันอาจรองรับหนึ่งหรือทั้งสองคำสั่งต่อไปนี้ทั้งนี้ขึ้นอยู่กับ netcat รุ่นของคุณ
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
อีกวิธีหนึ่งคือรอให้กระบวนการเซิร์ฟเวอร์เปิดซ็อกเก็ตการฟัง
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
หากคุณอยู่บน Mac OS, netstat จะใช้รูปแบบเอาต์พุตที่แตกต่างกันเล็กน้อยดังนั้นคุณจะต้องการอินสแตนซ์ต่อไปนี้:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
หรือคุณอาจต้องการกำหนดเป้าหมาย ID กระบวนการเฉพาะ:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
ฉันไม่สามารถคิดวิธีที่จะตอบสนองต่อกระบวนการที่เริ่มฟังซ็อกเก็ต (ซึ่งจะหลีกเลี่ยงวิธีการโพล) ที่ใช้งานptrace
ไม่ได้
nc -w 2 </dev/null >/dev/null
- หากการเชื่อมต่อใช้เวลานานกว่า 2 วินาทีมันจะหมดเวลาและล้มเหลว - ซึ่งเป็นประโยชน์สำหรับการใช้งานของฉัน
nc -q 1 localhost 13000 </dev/null
ส่งคืนทันทีถ้าไม่มีเซิร์ฟเวอร์ที่รับฟัง แต่กลับมาพร้อมรหัสข้อผิดพลาดดังนั้น loop จะทำให้ sleep และลองอีกครั้งหลังจากนั้นสองสามวินาที
หากคุณมี bash และ coreutils (เช่นหมดเวลานอน) แต่ไม่ใช่ nc / lsof / netstat คุณสามารถใช้โซลูชันนี้ซึ่งใช้ซ็อกเก็ต tcp magic bash:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
ตามตัวอย่างก่อนหน้านี้ด้วยbash
เวทมนต์ tcp sockets ต่อไปนี้เป็นเวอร์ชั่นปรับปรุงที่รอการเชื่อมต่อในช่วงระยะเวลาที่ จำกัด
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
ข้อแตกต่างคือถ้าไม่มีการเชื่อมต่อระหว่าง15s
- มันจะไม่วนซ้ำตลอดไป แต่ออกด้วยรหัสข้อผิดพลาด
สิ่งนี้มีประโยชน์ในสคริปต์เริ่มต้นเพื่อรอความพร้อม / ความพร้อมใช้งานของบริการหลังจากเริ่มต้น