Як перевірити, чи певний порт відкритий на машині зі скрипту оболонки та виконувати дії, засновані на цьому?


24

Я запускаю свій скрипт оболонки нижче на машині, на якій працює сервер додатків 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після чого я хочу перевірити, чи 8080відкрито порт $HOSTNAMEчи ні. Якщо ні, то це означає, що сервер не працює, тому я хочу перезапустити сервер, виконавши цю команду, а потім спати протягом 30 секунд, як показано вище в сценарії оболонки.

/opt/app/test/start_stop.sh start

Чи можливо це зробити тут, у моїй вище скрипті оболонки?

Я запускаю цей скрипт оболонки на Ubuntu 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


Дякую Волкер. Я спробував це, lsof -i :8080 -sTCP:LISTENі я нічого не отримую на консолі, але якщо я пробую це, netstat -tulpn | grep :8080то я отримую свій процес, який працює на порту 8080, чому так?
Девід

Який вихід 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
Девід

Дивно, якщо я спробую подібні речі, це працює. Може бути пов'язано з IPv6 ... хммм.
Волкер Зігель

Чи вказано в списку lsof -iTCP -sTCP:LISTEN | grep 8080?
Volker Siegel

16

Найпростіший спосіб в баші. Перевірте, чи ваш порт відкритий.

(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- чудове рішення для мого використання; спасибі за пропозицію
Джон

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.