쉘 스크립트로 특정 포트가 머신에서 열려 있는지 확인하고이를 기반으로 조치를 수행하는 방법은 무엇입니까?


24

c ++ 응용 프로그램 서버가 포트 8080에서 실행되는 컴퓨터에서 아래 셸 스크립트를 실행하고 있으며 셸 스크립트에서 URL을 실행하고 해당 URL에서 오는 응답을 DATA 변수에 저장합니다.

그러나 동일한 앱 서버가 다운되면 URL을 실행할 수 없으며 Retrying Again30 초 동안 인쇄 및 휴면 상태를 유지 한 다음 동일한 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

위의 쉘 스크립트에서 이것이 가능합니까?

우분투 12.04 에서이 쉘 스크립트를 실행 중입니다.

답변:


23

이 프로그램을 lsof사용하면 파일이나 포트와 같은 리소스를 사용하는 프로세스를 확인할 수 있습니다.

포트 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

bash에서 가장 간단한 방법. 포트가 열려 있는지 테스트하십시오.

(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

보고:

127.0.0.1 8080 포트 [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.