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