120秒間コマンドを確認してループを停止します。

120秒間コマンドを確認してループを停止します。
nmap_vm(){ 
    while (( SECONDS < 120 )); do

        sshportactive=$(nmap $kernel_ipv4 -PN -p ssh | egrep 'open|closed|filtered' | awk '{print $2}')
            if [[ $sshportactive == open ]]; then
            $(setup_vm)
            break
            fi
            $(failed_VM)
    done

}

複数の仮想マシンを起動し、SSHポートが開いていることを確認しようとしています。引き続き確認する方法sshportactive==開く120秒まで。

120秒前に値に達すると中断され、実行されます。$(setup_vm)&値が== 120秒まで開かない場合は、ループを中断して実行します。$(失敗した仮想マシン)

編集1

おっしゃったように試してみましたが、120秒間待ちません。 (以下にサンプルコードを公開しました。本番の他の機能からIPを取得します。)

funA(){

    #Now we nmap to check if the SSH is Working or Not
    t_start=$SECONDS

    while (( (SECONDS - t_start) < 10 )); do
        if nmap $1 -PN -p ssh -oG - | grep -q '22/open/tcp'; then
            echo " This VM is Working Properly $2"
            return 0
        fi
        sleep 1
    done

    # we only get here if the loop exits without the port being open
    echo "This VM is not working $2"
    return 1
}

funB(){

        funA 172.105.252.241 lol
        funA 192.46.213.31 lol
}

私たちが得た結果は次のとおりです。

bash -x g.sh 
+ funB
+ funA 172.105.252.241 lol
+ t_start=0
+ ((  (SECONDS - t_start) < 10  ))
+ nmap 172.105.252.241 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ echo ' This VM is Working Properly lol'
 This VM is Working Properly lol
+ return 0
+ funA 192.46.213.31 lol
+ t_start=0
+ ((  (SECONDS - t_start) < 10  ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ ((  (SECONDS - t_start) < 10  ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ ((  (SECONDS - t_start) < 10  ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ ((  (SECONDS - t_start) < 10  ))
+ nmap 192.46.213.31 -PN -p ssh -oG -
+ grep -q 22/open/tcp
+ sleep 1
+ ((  (SECONDS - t_start) < 10  ))
+ echo 'This VM is not working lol'
This VM is not working lol
+ return 1

編集2

本番で使用するスクリプトから直接公開します。

ipv4_11011_22022="192.46.209.19"
ipv4_33033_44044_10101="45.79.121.184"
ipv4_55055_10001_20002="172.105.47.73"
ipv4_20202_30303_40404_50505_30033="172.105.58.123"
ipv4_30003_40004_50005="172.105.34.152"
ipv4_10011_20022_40044="45.79.124.118"
ipv4_50055_11111="172.105.48.47"
ipv4_22222_33333="172.105.51.44"
ipv4_44444_55555="172.105.253.130"
ipv4_KERNEL="172.105.42.211"
VM1_LABEL="11011_22022"
VM2_LABEL="33033_44044_10101"
VM3_LABEL="55055_10001_20002"
VM4_LABEL="20202_30303_40404_50505_30033"
VM5_LABEL="30003_40004_50005"
VM6_LABEL="10011_20022_40044"
VM7_LABEL="50055_11111"
VM8_LABEL="22222_33333"
VM9_LABEL="44444_55555"
VMK_LABEL="KERNEL"


healthcheck(){


    nmap $ipv4_11011_22022 $VM1_LABEL
    nmap $ipv4_33033_44044_10101 $VM2_LABEL
    nmap $ipv4_55055_10001_20002 $VM3_LABEL
    nmap $ipv4_20202_30303_40404_50505_30033 $VM4_LABEL
    nmap $ipv4_30003_40004_50005 $VM5_LABEL
    nmap $ipv4_10011_20022_40044 $VM6_LABEL
    nmap $ipv4_50055_11111 $VM7_LABEL
    nmap $ipv4_22222_33333 $VM8_LABEL
    nmap $ipv4_44444_55555 $VM9_LABEL
    nmap $ipv4_KERNEL $VMK_LABEL

}


nmap(){
    #Now we nmap to check if the SSH is Working or Not
    t_start=$SECONDS

    while (( (SECONDS - t_start) < 120 )); do
        if nmap $1 -PN -p ssh -oG - | grep -q '22/open/tcp'; then
            echo " This VM is Working Properly $2"
                return 0
        fi
        sleep 5
    done

    # we only get here if the loop exits without the port being open
    healthcheck_failed $2
    return 1
}

healthcheck_failed(){

    echo "Healthcheck of VM $1 FAILED"
}

healthcheck

私たちが得た結果は次のとおりです。 出力はここに公開されます。

何が間違っているのかIDK、スクリプトは移動されず、最初のIPに接続されています。

答え1

各ループ反復中の値を確認する代わりに、ループがSECONDS開始される前の値を記録し、各ループ反復の経過時間を計算して確認します。SECONDSたとえば、

#!/bin/bash

nmap_vm() {
    t_start=$SECONDS

    while (( (SECONDS - t_start) < 10 )); do
        if some_command; then
            echo "some_command succeeded"
            return 0
        fi

        sleep 1
    done

    # we only get here if the loop exits because the time expired
    echo "some_command failed"
    return 1
}

nmap_vm

failed_vm120秒後に接続できない場合にのみ呼び出して、次の結果が出るようにコードを更新してください。

#!/bin/bash

setup_vm() {
    echo setup vm
}

failed_vm() {
    echo failed vm
}

nmap_vm() {
    t_start=$SECONDS

    while (( (SECONDS - t_start) < 10 )); do
        # rather than nmap | egrep | awk, we can use nmap's "greppable" output and just look
        # for a specific fixed pattern
        if nmap $kernel_ipv4 -PN -p ssh -oG - | grep -q '22/open/tcp'; then
            setup_vm
            return 0
        fi

        # you don't necessarily need this delay in the loop but I like
        # to ensure a reasonable rate limit.
        sleep 1
    done

    # we only get here if the loop exits without the port being open
    failed_vm
    return 1
}

関連情報