나는 다음 스크립트를 작성했습니다.
#!/bin/bash
target="1.1.1.1"
while true;
do
ping $target -c 1 -v > /dev/null
if [[ $? -ne 0 ]]; then
echo "$(date +"%d/%m/%y %R:%S")" >> netStabilityLog
fi
sleep 5s
done
한 가지 문제만 제외하면 거의 완벽하게 작동합니다. 출력 파일에서 다음을 netStabilityLog
얻습니다.
28/06/22 17:19:26
28/06/22 17:20:06
28/06/22 17:45
28/06/22 18:36:00
28/06/22 18:51
초가 표시되지 않는 경우가 있습니다. 왜 그런 겁니까?
답변1
동시에 실행되는 여러 개의 약간 다른 스크립트 복사본이 있을 수 있으며 각각은 동일한 출력 파일에 기록됩니다. 실행 중인 스크립트 버전 중 하나 이상은 출력에 초를 추가하지 않습니다.
스크립트 자체에 관해서는 외부 유틸리티를 제거 date
하고 조건부 출력과 리디렉션을 다르게 수행한다는 제 의견을 말씀드릴 수 있습니다. 또한 누락된 참조를 정렬합니다.
#!/bin/bash
ipaddr=1.1.1.1
while true; do
if ! ping -c 1 "$ipaddr" >/dev/null 2>&1
then
printf '%(%d/%m/%y %T)T\n' -1
fi
sleep 5
done >>netStabilityLog
이는 버전 4.2에 도입된 형식 문자열을 사용합니다 %(...)T
. 이 매개변수를 사용하면 출력 타임스탬프를 생성할 때 현재 시간이 사용됩니다. 또한 모든 호출에 대해 리디렉션하지 않고 외부 루프에 대해 한 번만 리디렉션합니다.printf
bash
-1
printf
printf
$?
이 코드는 ping
with direct 를 사용하여 명시적인 테스트를 제거합니다 if
. ping
with (자세한 출력의 경우)는 -v
어쨌든 출력을 삭제하기 때문에 호출 되지 않습니다 .