特定のポートがシェルスクリプトからマシンで開いているかどうかを確認し、それに基づいてアクションを実行する方法は?


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で実行されているプロセスが表示されるのはなぜですか?
デビッド14

の出力はnetstat -tulpn | grep :8080何ですか?
フォルカーシーゲル14

これは私が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に関連している可能性があります...うーん。
フォルカージーゲル14

に記載されていlsof -iTCP -sTCP:LISTEN | grep 8080ますか?
フォルカーシーゲル14

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私のユースケースに最適なソリューションです。提案してくれてありがとう
ジョン

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.