Belirli bir portun bir makinede bir kabuk betiğinden açık olup olmadığı nasıl kontrol edilir ve buna göre işlem yapılır?


24

Aşağıdaki kabuk betiğimi, c ++ uygulama sunucusunun 8080 numaralı bağlantı noktasında çalıştığı bir makinede ve kabuk betiğinde bir URL yürütüyorum ve bu URL'den gelen yanıtı DATA değişkeninde saklıyorum.

Ancak, aynı uygulama sunucusunun kapalı olması durumunda, URL’yi çalıştıramayacağını ve ardından Retrying Again30 saniye boyunca yazdırıp uyuyacağını ve aynı URL’yi tekrar çalıştırdığını varsayalım .

#!/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"

Ve işte HOSTNAMEyukarıdaki kabuk betiğimi çalıştığım sunucunun yerel ana bilgisayar adı.

Sorun bildirimi:-

Şimdi yapmaya çalıştığım şey, sunucu kapalıysa, o zaman yazdırılacak ve Retrying Againbundan sonra bağlantı noktasının 8080açılıp açılmadığını kontrol etmek istiyorum $HOSTNAME. Eğer değilse, o zaman sunucu kapalı demektir, bu yüzden bu komutu uygulayarak sunucuyu yeniden başlatmak ve kabuk komut dosyasında yukarıda gösterildiği gibi 30 saniye boyunca uyumak istiyorum.

/opt/app/test/start_stop.sh start

Bu benim yukarıdaki kabuk betiğimde burada yapmak mümkün mü?

Bu kabuk betiğini Ubuntu 12.04'te çalıştırıyorum.

Yanıtlar:


23

Program lsof, dosya veya bağlantı noktaları gibi hangi işlemlerin hangi kaynakları kullandığını kontrol etmenizi sağlar.

8080 numaralı bağlantı noktasında hangi işlemlerin dinlendiğini göstermek için:

lsof -Pi :8080 -sTCP:LISTEN

Sizin durumunuzda, bir sürecin 8080'de dinleyip dinlemediğini test etmek istiyorsunuz - bu komutun dönüş değeri tam olarak bunu size söyler. Ayrıca işlemin pidini de yazdırır.

lsof -Pi :8080 -sTCP:LISTEN -t

Sadece teste ihtiyacınız varsa, çıkışı olmadan, aşağıdakilere yönlendirin /dev/null:

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


Yerel olarak birden fazla IP adresi olan birden fazla ana bilgisayar adı kullanıyorsanız, ana makine adını aynı şekilde belirtin
lsof -Pi @someLocalName:8080 -sTCP:LISTEN


Teşekkürler Volker. Bunu denedim lsof -i :8080 -sTCP:LISTENve konsolda bir şey alamıyorum, ancak bunu deniyorsam netstat -tulpn | grep :80808080 portunda çalışan işlemimi alıyorum, neden böyle?
david

Çıktı nedir netstat -tulpn | grep :8080?
Volker Siegel

Bu, netstat ile elde ettiğim şey - 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,

Garip, benzer şeyler denersem işe yarar. IPv6 ... hmmm ile ilgili olabilir.
Volker Siegel

Listeleniyor lsof -iTCP -sTCP:LISTEN | grep 8080mu?
Volker Siegel

16

Bash en basit yolu. Bağlantı noktanızın açık olup olmadığını test edin.

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

Ekoyu istediğiniz şekilde değiştirin.

Veya nc kullanabilirsiniz.

nc -vz 127.0.0.1 8080

İade:

127.0.0.1 8080 bağlantı noktasına bağlantı [tcp / *] başarılı oldu


1
nckullanım durumum için harika bir çözüm; önerdiğin için teşekkürler
Jon

1

RJ'in hangi notların ncda yararlı olduğunu cevaplamasıyla detaylandırılıyor ... ncHızlı komut satırı sorgusu için sadece yararlı değil

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

fakat eğer insan tarafından okunabilirlik konusu peşinde olduğun şey değilse -v olmadan kullanılabilir - örneğin, bir betikte kullanım için (çıkış kodu portun açık mı kapalı mı olduğunu gösterir).

 nc -z 127.0.0.1 8080

 echo $?             
1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.