호스트 주소 목록(비연속)을 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 >
대신 사용한다는 것입니다 . 따라서 실행할 때마다 파일이 깨끗해지며 종료 코드 사용이 단순화됩니다 .>>
date
ping
청소기는
if verb; then
action
else
failure_action
fi
대신에
verb
if [[ 0 -eq $? ]]; then
action
else
failure_action
fi
또한 출력 파일의 이름을 이동하거나 변경하기로 결정한 경우 네 곳을 편집할 필요 없이 변수에 넣어서 한 곳에서만 업데이트하면 됩니다. 내 일반적인 경험 법칙은 "같은 내용을 두 번 이상 입력하면 추상화해야 한다"입니다.