วิธีการตรวจสอบว่าพอร์ตเฉพาะเปิดอยู่บนเครื่องจากเชลล์สคริปต์และดำเนินการตามนั้น


24

ฉันใช้เชลล์สคริปต์ด้านล่างของฉันบนเครื่องที่เซิร์ฟเวอร์แอ็พพลิเคชัน c ++ กำลังรันบนพอร์ต 8080 และในเชลล์สคริปต์ฉันกำลังเรียกใช้ URL และเก็บการตอบสนองที่มาจาก URL นั้นในตัวแปร DATA

แต่สมมติว่าเซิร์ฟเวอร์แอปเดียวกันหยุดทำงานแล้วจะไม่สามารถเรียกใช้ URL และจะพิมพ์ออกมาRetrying Againและพักเป็นเวลา 30 วินาทีจากนั้นเรียกใช้ URL เดิมอีกครั้ง

#!/bin/bash

HOSTNAME=$hostname
DATA=""
RETRY=15

echo $HOSTNAME

while [ $RETRY -gt 0 ]
do
    DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat)
    if [ $? -eq 0 ]
    then
        break
    else
        echo "Retrying Again" >&2

        # restart the server

        let RETRY-=1
        sleep 30
    fi
done

echo "Server is UP"

และนี่HOSTNAMEคือชื่อโฮสต์ท้องถิ่นของเซิร์ฟเวอร์ที่ฉันใช้งานเชลล์สคริปต์ด้านบน

คำชี้แจงปัญหา:-

ตอนนี้สิ่งที่ฉันพยายามทำคือถ้าเซิร์ฟเวอร์ไม่ทำงานมันจะพิมพ์ออกมาRetrying Againหลังจากนั้นฉันต้องการตรวจสอบว่าพอร์ต8080เปิดอยู่$HOSTNAMEหรือไม่ ถ้าไม่เช่นนั้นแสดงว่าเซิร์ฟเวอร์หยุดทำงานดังนั้นฉันต้องการรีสตาร์ทเซิร์ฟเวอร์โดยดำเนินการคำสั่งนี้จากนั้นเข้าสู่โหมดสลีปเป็นเวลา 30 วินาทีดังแสดงในเชลล์สคริปต์

/opt/app/test/start_stop.sh start

เป็นไปได้ที่จะทำที่นี่ในสคริปต์เปลือกของฉันหรือไม่

ฉันใช้งานเชลล์สคริปต์นี้บน Ubuntu 12.04

คำตอบ:


23

โปรแกรมlsofช่วยให้คุณสามารถตรวจสอบกระบวนการที่กำลังใช้ ressources ใดเช่นไฟล์หรือพอร์ต

เพื่อแสดงกระบวนการที่กำลังรับฟังบนพอร์ต 8080:

lsof -Pi :8080 -sTCP:LISTEN

ในกรณีของคุณคุณต้องการทดสอบว่ากระบวนการกำลังรับฟังบน 8080 หรือไม่ค่าส่งคืนของคำสั่งนี้จะบอกคุณเพียงแค่นั้น นอกจากนี้ยังพิมพ์ pid ของกระบวนการ

lsof -Pi :8080 -sTCP:LISTEN -t

หากคุณต้องการเพียงแค่การทดสอบโดยไม่มีผลลัพธ์ให้เปลี่ยนเส้นทางไปที่/dev/null:

if lsof -Pi :8080 -sTCP:LISTEN -t >/dev/null ; then
    echo "running"
else
    echo "not running"
fi


หากคุณใช้ชื่อโฮสต์หลายชื่อที่มีที่อยู่ IP หลายแห่งในเครื่องให้ระบุชื่อโฮสต์เหมือนกัน
lsof -Pi @someLocalName:8080 -sTCP:LISTEN


ขอบคุณ Volker ฉันลองสิ่งนี้lsof -i :8080 -sTCP:LISTENและฉันไม่ได้อะไรเลยบนคอนโซล แต่ถ้าฉันลองทำเช่นนี้netstat -tulpn | grep :8080ฉันจะได้กระบวนการที่ทำงานบนพอร์ต 8080 ทำไมถึงเป็นเช่นนั้น
david

อะไรคือผลลัพธ์ของnetstat -tulpn | grep :8080?
Volker Siegel

นี่คือสิ่งที่ฉันได้รับจาก netstat - david@machineA:/home/david$ netstat -tulpn | grep :8080 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 27530/test_server
david

แปลกถ้าฉันลองสิ่งที่คล้ายกันมันได้ผล อาจเกี่ยวข้องกับ IPv6 ... hmmm
Volker Siegel

มันอยู่ในรายการด้วยlsof -iTCP -sTCP:LISTEN | grep 8080?
Volker Siegel

16

วิธีที่ง่ายที่สุดในการทุบตี ทดสอบว่าพอร์ตของคุณเปิดอยู่หรือไม่

(echo >/dev/tcp/localhost/8080) &>/dev/null && echo "TCP port 8080 open" || echo "TCP port 8080 close"

แทนที่เสียงสะท้อนด้วยสิ่งที่คุณต้องการ

หรือคุณสามารถใช้ NC

nc -vz 127.0.0.1 8080

ผลตอบแทน:

การเชื่อมต่อกับพอร์ต 8080 127.0.0.1 [tcp / *] สำเร็จ


1
ncเป็นทางออกที่ดีสำหรับกรณีการใช้งานของฉัน; ขอบคุณที่แนะนำ
Jon

1

อธิบายรายละเอียดเกี่ยวกับคำตอบของ RJ ซึ่งโน้ตncนั้นมีประโยชน์ ... ไม่เพียง แต่มีncประโยชน์สำหรับการสืบค้นบรรทัดคำสั่งอย่างรวดเร็ว

 nc -z -v -w5 127.0.0.1 8080
localhost [127.0.0.1] 8080 (http-alt) : Connection refused

แต่มันสามารถใช้งานได้โดยไม่มี -v หากสิ่งที่มนุษย์สามารถอ่านได้ไม่ใช่สิ่งที่คุณต้องการ - เช่นเพื่อใช้ในสคริปต์ (รหัสทางออกจะระบุว่าพอร์ตนั้นเปิดหรือปิดอยู่)

 nc -z 127.0.0.1 8080

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