web-dev-qa-db-ja.com

失敗が止まるまでコマンドを実行する

コマンドが正常に完了するまで実行してから停止したいと思います。これを行うためにbashループを設定できることは知っていますが、私が探していることを実行するwatch -n5のようなポータブルな方法があるかどうか知りたいです。

使用例:SSH経由で、まだ稼働していない可能性のあるサーバーに接続しようとしています。

7
Stefan Mai

$1を使用して実行する実際のコマンドを指定し、$2を使用して任意のスリープ値を指定して、上記のbashループをスクリプトでラップするだけです。これを行うと、次のようなコマンドを実行できるようになります。

$ reallyrunit "ls" 5
4
EEAA
#xxx.xxx.xxx.xxx = ipaddr ssh Host 
 until [`nmap --open -p 22 xxx.xxx.xxx.xxx | grep -c" ssh "` -eq 1] 
 do 
 sleep 4 
 done 
 
#ssh stuff here 
5
Bart

これを行うための組み込み機能はわかりませんが、使用するbashは次のようなものです。

RET=1;until [[ $RET = 0 ]];do echo "$(date): About to make an attempt to connect"; ssh 192.168.33.12; RET="$?";sleep 1;done

編集:日付とコメントを追加して、失敗した期間を追跡できるようにしました。

1
Jed Daniels

これをbashループで構成します。システムをポーリングして(ping、nmapなど)、サービスの状態を判別し、成功した場合は接続することもできると思います。

0
ewwhite

出口値をゼロ以外の値に設定してから、コマンドが出口0(成功)で戻るまでループすることができます。これが私が持っているスクリプトです:

#!/bin/sh

cd /exports/home/exports/sl
$(exit 1)


while [ $? != 0 ]; do rsync -avlH --delete  --exclude=6.1/archive --exclude=6.1/i386/archive --exclude=6.1/x86_64/archive --exclude=6.1/i386/iso --exclude=
6.1/x86_64/iso rsync://rsync.gtlib.gatech.edu/scientific/6.1 6.1/; done

最高のスクリプトではありません-それは、rsyncが失敗したときに、正常に終了するまで再起動することを保証するという思考実験でした。

編集:あなたの場合、あなたはおそらく次のようなものが欲しいでしょう:

#!/bin/sh

$(exit 1) ; while [ $? != 0 ]; do sleep 1 ; nc -vvv  -z 192.168.15.37 22  && ssh 192.168.15.37  ; done

エラー条件をあちこちに追加できますが、重要なことは、ポートが開いていることを確認したらすぐに接続することです。これは、&&操作の目的です。前のコマンドが成功すると、次のコマンドが実行されます。 (それまでは、接続に失敗するとゼロ以外の終了コードが返され、ループが続行されます)。正常にログインしてからログアウトすると、正常にログインしたセッションから返される終了コードによってループが終了します。

(sleepコマンドはオプションですが、スリープループがないと、最小化するか次のウィンドウに切り替えるまでディスプレイの速度が低下する場合があります。これは、ディスプレイがリモートデスクトップの場合に問題になる可能性があります)

0
Rilindo