自分のコンピュータに特定のポートが開いているかどうかをシェルスクリプトでどのように確認し、それに応じて対処できますか?

自分のコンピュータに特定のポートが開いているかどうかをシェルスクリプトでどのように確認し、それに応じて対処できますか?

私はコンピュータ上で以下のシェルスクリプトを実行していますが、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確認することです。それ以外の場合はサーバーがダウンしているため、このコマンドを実行してサーバーを再起動し、上記のシェルスクリプトのように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

関連情報