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
}

관련 정보