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

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

私はコンピュータ上で以下のシェルスクリプトを実行していますが、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

おすすめ記事