저는 컴퓨터에서 아래 셸 스크립트를 실행하고 있고, 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
확인하는 것입니다 . 그렇지 않은 경우 서버가 다운된 것이므로 이 명령을 실행하여 서버를 다시 시작한 다음 위의 쉘 스크립트와 같이 30초 동안 절전 모드로 전환하려고 합니다.8080
$HOSTNAME
/opt/app/test/start_stop.sh start
위의 쉘 스크립트에서 이 작업을 수행할 수 있습니까?
저는 Ubuntu 12.04에서 이 쉘 스크립트를 실행하고 있습니다.
답변1
이 프로그램을 사용하면 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
답변2
Bash에서 가장 간단한 방법입니다. 포트가 열려 있는지 테스트하십시오.
(echo >/dev/tcp/localhost/8080) &>/dev/null && echo "TCP port 8080 open" || echo "TCP port 8080 not open"
포트를 테스트 중인 포트로 바꾸십시오.
아니면 NC를 사용해도 됩니다.
nc -vz 127.0.0.1 8080
반품:
127.0.0.1 8080 포트 [tcp/*]에 성공적으로 연결되었습니다.
답변3
빠른 명령줄 쿼리 뿐만 아니라 주석 nc
도 유용한 RJ의 답변에 대해 자세히 설명합니다.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