여러 호스트를 ping하고 명령을 실행합니다.

여러 호스트를 ping하고 명령을 실행합니다.

저는 bash 스크립팅과 유닉스를 처음 접했기 때문에 도움이 필요합니다. 7-10개의 호스트가 있고 cronjob을 통해 서버 중 하나에서 호스트를 핑하고 싶습니다. 내가 원하는 것은 호스트가 명령을 실행할 수 있는 때입니다. 떨어뜨리면 아무 일도 일어나지 않습니다.

로그나 메시지는 필요하지 않습니다. 나는 이것을 지금까지 가지고 있지만 불행하게도 아직 그것을 시도할 능력이 없습니다. 확인해보시고 지적해주시면 감사하겠습니다.

#!/bin/bash
servers=( "1.1.1.1" "2.2.2.2" "3.3.3.3" "4.4.4.4" "5.5.5.5" "6.6.6.6" "7.7.7.7" )

for i in "${servers[@]}"
do
  ping -c 1 $i > /dev/null  
done

ping -c 1 $i > /dev/null
if [ $? -ne 0 ]; then

    if [ $STATUS >= 2 ]; then
        echo ""
    fi
else
    while [ $STATUS <= 1 ];
    do 
       # command should be here where is status 1 ( i.e. Alive )
       /usr/bin/snmptrap -v 2c -c public ...
    done
fi

이것이 맞는지 잘 모르겠습니다. 튜토리얼에서 이것을 사용했지만 정확히 무엇을 하는지 잘 모르는 부분이 있습니다.

나는 여기서 올바른 길을 가고 있습니까, 아니면 완전히 틀렸습니까?

답변1

스크립트의 다른 부분이 수행하는 작업을 설명하기 위해 몇 가지 설명을 작성했습니다. 그런 다음 아래 스크립트의 간결한 버전을 만들었습니다.

#!/bin/bash
servers=( "1.1.1.1" "2.2.2.2" "3.3.3.3" "4.4.4.4" "5.5.5.5" "6.6.6.6" "7.7.7.7" )

# As is, this bit doesn't do anything.  It just pings each server one time 
# but doesn't save the output

for i in "${servers[@]}"
do
  ping -c 1 $i > /dev/null  
# done
# "done" marks the end of the for-loop.  You don't want it to end yet so I
# comment it out

# You've already done this above so I'm commenting it out
#ping -c 1 $i > /dev/null

    # $? is the exit status of the previous job (in this case, ping).  0 means
    # the ping was successful, 1 means not successful.
    # so this statement reads "If the exit status ($?) does not equal (-ne) zero
    if [ $? -ne 0 ]; then
        # I can't make sense of why this is here or what $STATUS is from
        # You say when the host is down you want it to do nothing so let's do
        # nothing
        #if [ $STATUS >= 2 ]; then
        #    echo ""
        #fi
        true
    else
        # I still don't know what $STATUS is
        #while [ $STATUS <= 1 ];
        #do 
           # command should be here where is status 1 ( i.e. Alive )
           /usr/bin/snmptrap -v 2c -c public ...
        #done
    fi

# Now we end the for-loop from the top
done

각 서버에 매개변수가 필요한 경우 for 루프에서 매개변수 배열과 인덱스 변수를 만듭니다. 색인을 통해 매개변수에 액세스:

#!/bin/bash
servers=( "1.1.1.1" "2.2.2.2" "3.3.3.3" "4.4.4.4" "5.5.5.5" "6.6.6.6" "7.7.7.7" )
params=(PARAM1 PARAM2 PARAM3 PARAM4 PARAM5 PARAM6 PARAM7)

n=0
for i in "${servers[@]}"; do
    ping -c 1 $i > /dev/null  

    if [ $? -eq 0 ]; then
       /usr/bin/snmptrap -v 2c -c public ${params[$n]} ...
    fi

    let $((n+=1)) # increment n by one

done

답변2

더욱 간결해졌습니다.

#!/bin/bash

서버 = ("1.1.1.1" "2.2.2.2" "3.3.3.3" "4.4.4.4" "5.5.5.5" "6.6.6.6" "7.7.7.7")

나는 "${servers[@]}"에서 수행합니다.
    ping -c 1 $i > /dev/null && /usr/bin/snmptrap -v 2c -c 공개...
완벽한

참고: ping 뒤의 "&&"는 "IF TRUE THEN"을 의미합니다. ping의 경우 TRUE는 ping이 실패하지 않았음을 의미합니다(즉, 서버가 ping에 성공적으로 응답함).

관련 정보