Como verificar se uma porta específica está aberta em uma máquina a partir de um script de shell e executar uma ação com base nisso?

17

Estou executando meu script de shell abaixo em uma máquina na qual o servidor de aplicativos c ++ está em execução na porta 8080 e no script de shell estou executando uma URL e armazena a resposta proveniente dessa URL na variável DATA.

Mas, suponha que, se o mesmo servidor de aplicativos estiver inativo, ele não poderá executar a URL e, em seguida, imprimirá Retrying Again , suspenderá por 30 segundos e executará a mesma URL novamente.

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

E aqui HOSTNAME é o nome do host local do servidor no qual estou executando o script de shell acima.

Descrição do problema: -

Agora, o que estou tentando fazer é, se o servidor estiver inativo, imprimir Retrying Again , para depois verificar se a porta 8080 está aberta em $HOSTNAME ou não. Se não, significa que o servidor está inativo, portanto, quero reiniciar o servidor executando este comando e, em seguida, dormir por 30 segundos, conforme mostrado acima no script de shell.

/opt/app/test/start_stop.sh start

Isso é possível fazer aqui no meu script de shell acima?

Estou executando este script de shell no Ubuntu 12.04.

    
por david 09.08.2014 / 18:53

3 respostas

22

O programa lsof permite que você verifique quais processos estão usando quais recursos, como arquivos ou portas.

Para mostrar quais processos estão escutando na porta 8080:

lsof -Pi :8080 -sTCP:LISTEN

No seu caso, você quer testar se um processo está escutando 8080 - o valor de retorno deste comando diz exatamente isso. Também imprime o pid do processo.

lsof -Pi :8080 -sTCP:LISTEN -t

Se você precisar apenas do teste, sem saída, redirecione-o para /dev/null :

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


Se você usar vários nomes de host com vários endereços IP localmente, especifique também o nome do host como% lsof -Pi @someLocalName:8080 -sTCP:LISTEN

    
por 10.08.2014 / 05:14
11

Maneira mais simples no bash. Teste se sua porta está aberta.

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

Substitua o eco pelo que você deseja.

Ou você pode usar nc.

nc -vz 127.0.0.1 8080

Retorna:

Connection to 127.0.0.1 8080 port [tcp/*] succeeded

    
por 22.08.2014 / 03:09
0

Elaborando a resposta do RJ, que indica que nc também é útil ... Não só é nc útil para consulta de linha de comando rápida

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

mas ele pode ser usado sem -v se a coisa de legibilidade humana não for o que você procura - por exemplo, para uso em um script (o código de saída indicará se a porta está aberta ou fechada). / p>

❯ nc -z 127.0.0.1 8080

❯ echo $?             
1
    
por 21.03.2017 / 17:11