Come verificare se una determinata porta è aperta su una macchina da uno script di shell ed eseguire azioni basate su quella?


24

Sto eseguendo il mio script di shell sottostante su una macchina su cui è in esecuzione il server delle applicazioni c ++ sulla porta 8080 e nello script di shell sto eseguendo un URL e memorizza la risposta proveniente da tale URL nella variabile DATA.

Supponiamo che se lo stesso server delle applicazioni non è attivo, non sarà in grado di eseguire l'URL e quindi verrà stampato Retrying Againe inattivo per 30 secondi, quindi eseguirà nuovamente lo stesso 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"

Ed ecco HOSTNAMEil nome host locale del server su cui sto eseguendo il mio script shell sopra.

Dichiarazione problema:-

Ora quello che sto cercando di fare è, se il server è inattivo, quindi verrà stampato, Retrying Againquindi dopo voglio verificare se la porta 8080è aperta $HOSTNAMEo meno. In caso contrario, significa che il server è inattivo, quindi voglio riavviare il server eseguendo questo comando e quindi dormire per 30 secondi, come mostrato sopra nello script della shell.

/opt/app/test/start_stop.sh start

È possibile farlo qui nel mio script della shell sopra?

Sto eseguendo questo script di shell su Ubuntu 12.04.

Risposte:


23

Il programma lsofconsente di verificare quali processi stanno utilizzando quali risorse, come file o porte.

Per mostrare quali processi sono in ascolto sulla porta 8080:

lsof -Pi :8080 -sTCP:LISTEN

Nel tuo caso, vuoi verificare se un processo è in ascolto su 8080: il valore restituito da questo comando ti dice proprio questo. Stampa anche il pid del processo.

lsof -Pi :8080 -sTCP:LISTEN -t

Se hai bisogno solo del test, senza output, reindirizzalo a /dev/null:

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


Se si utilizzano più nomi host con più indirizzi IP localmente, specificare anche il nome host come
lsof -Pi @someLocalName:8080 -sTCP:LISTEN


Grazie Volker. Ho provato questo lsof -i :8080 -sTCP:LISTENe non sto ottenendo nulla sulla console ma se sto provando questo netstat -tulpn | grep :8080ottengo il mio processo che è in esecuzione sulla porta 8080 perché è così?
David,

Qual è l'output di netstat -tulpn | grep :8080?
Volker Siegel,

Questo è quello che ottengo con 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

Strano, se provo cose simili, funziona. Potrebbe essere correlato a IPv6 ... hmmm.
Volker Siegel,

È elencato con lsof -iTCP -sTCP:LISTEN | grep 8080?
Volker Siegel,

16

Il modo più semplice in bash. Verifica se la tua porta è aperta.

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

Sostituisci l'eco con quello che vuoi.

Oppure puoi usare nc.

nc -vz 127.0.0.1 8080

Ritorna:

Connessione alla porta 127.0.0.1 8080 [tcp / *] riuscita


1
ncè un'ottima soluzione per il mio caso d'uso; grazie per aver suggerito
Jon

1

Elaborare la risposta di RJ quali note ncè anche utile ... Non solo è ncutile per una rapida query da riga di comando

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

ma può essere usato senza -v se la cosa della leggibilità umana non è ciò che stai cercando, ad esempio, per l'uso in uno script (il codice di uscita indicherà se la porta è aperta o chiusa).

 nc -z 127.0.0.1 8080

 echo $?             
1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.