파일에서 IP 주소 목록을 ping하고 상태를 "up" 또는 "down"으로 기록해야 합니다.

파일에서 IP 주소 목록을 ping하고 상태를 "up" 또는 "down"으로 기록해야 합니다.

호스트 주소 목록(비연속)을 ping하고 출력을 "up" 또는 "down"으로 기록해야 합니다. 시작했지만 스크립트에 문제가 있는 것 같습니다. 예를 들어. 150개의 호스트가 포함된 호스트 파일에 대해 다음 스크립트를 실행하면 출력 파일에서 400개 이상의 "up" 또는 "down" 응답을 받습니다.

#!/usr/bin/bash
#script name: lrkdc01ping.sh
date >> /home/insight/scripts/lrkdc01ping.out
cat /home/insight/scripts/lrkdc01.txt |  while read output
do
    ping -c 1 "$output" >> /dev/null
    if [ $? -eq 0 ]; then
        echo "node is up" >> /home/insight/scripts/lrkdc01ping.out
    else
        echo "node is down" >> /home/insight/scripts/lrkdc01ping.out
    fi
done

답변1

매번 출력 파일을 추가하는 대신 실행될 때마다 출력 파일을 지우는 다음과 같은 것을 제안합니다.

#!/usr/local/bin/bash
outfile="/home/insight/scripts/lrkdc01ping.out"
date > "$outfile"
while read output; do
    echo -n "$output is " >> "$outfile"
    if ping -c1 "$output" > /dev/null 2>&1; then
        echo "up" >> "$outfile"
    else
        echo "down" >> "$outfile"
    fi
done < /home/insight/scripts/lrkdc01.txt

주요 차이점은 call >대신 사용한다는 것입니다 . 따라서 실행할 때마다 파일이 깨끗해지며 종료 코드 사용이 단순화됩니다 .>>dateping

청소기는

if verb; then
    action
else
    failure_action
fi

대신에

verb
if [[ 0 -eq $? ]]; then
    action
else
    failure_action
fi

또한 출력 파일의 이름을 이동하거나 변경하기로 결정한 경우 네 곳을 편집할 필요 없이 변수에 넣어서 한 곳에서만 업데이트하면 됩니다. 내 일반적인 경험 법칙은 "같은 내용을 두 번 이상 입력하면 추상화해야 한다"입니다.

관련 정보