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