풀 상태를 확인하려면 스크립트를 만들어야 합니다. 각 풀은 다음 검사 결과를 반환합니다.
pool1 - scan: scrub repaired 0 in 0 days 00:06:17 with 0 errors on Thu Sep
pool2 - scan: scrub in progress since Thu Sep
pool3 - scan: scrub repaired 0 in 0 days 00:04:02 with 0 errors on Thu Sep
pool4 - scan: scrub repaired 0 in 0 days 00:04:22 with 0 errors on Thu Sep
각각을 반복하여 스캔이 완료되었는지 확인해야 합니다. 둘 다 포함되어 있으면 스크럽 수리그럼 뭔가를 해보세요. 진행 중인 작업이 한두 개 있으면 5초마다 확인하고 모두 완료될 때까지 기다려야 합니다. 지금까지는 do/until 루프가 없습니다.
declare -a scans=("pool1 - scan: scrub repaired 0 in 0 days 00:06:17 with 0 errors on Thu Sep"
"pool2 - scan: scrub in progress since Thu Sep"
"pool3 - scan: scrub repaired 0 in 0 days 00:04:02 with 0 errors on Thu Sep"
"pool4 - scan: scrub repaired 0 in 0 days 00:04:22 with 0 errors on Thu Sep"
for scan in "${scans[@]}"; do
echo "$scan"
if ![[ $scan == *"scrub repaired"* ]]; then
echo "Scan in progress. Waiting.."
elif [[ $scan == *"scrub repaired"* ]]; then
echo "Scan is ready. Saving it somewhere for documentation"
else
continue
fi
break
done
답변1
이에 대해 조사하는 데 몇 시간을 보냈으므로 여기에 원래 아이디어에서 크게 벗어나지 않는 최적화되지 않은 솔루션이 있습니다.
#!/usr/bin/bash
declare -a scans=("pool1 - scan: scrub repaired 0 in 0 days 00:06:17 with 0 errors on Thu Sep" "pool2 - scan: scrub in progress since Thu Sep" "pool3 - scan: scrub repaired 0 in 0 days 00:04:02 with 0 errors on Thu Sep" "pool4 - scan: scrub repaired 0 in 0 days 00:04:22 with 0 errors on Thu Sep")
pools_to_complete=${#scans[@]}
pools_completed=0
while ! [ "$pools_completed" == "$pools_to_complete" ]; do
pools_completed=$(grep -c "scrub repaired" < <(for scan in "${scans[@]}"; do printf "%s\n" "$scan";done))
if [ "$pools_completed" == "$pools_to_complete" ]; then
printf "All %s scans are complete. Saving it somewhere for documentation\n" "$pools_to_complete"
else
printf "Scan in progress. Waiting...\n"
sleep 5
fi
done
위의 것보다 더 잘할 수 있습니다. 귀하의 접근 방식에 대한 주요 변경 사항은 다음과 같습니다.
- 각 풀 프로세스의 실행 추적(완료 또는 불완전)을 Bash 배열에 저장하지 마세요. 배열은 유용하지만 쉘 스크립트를 이식 불가능하게 만듭니다.
- 배열 대신 외부 파일( )에 각 트레이스를 저장합니다(
infile
한 행에 하나의 트레이스).
어레이를 외부 파일로 교체하려면 위의 두 가지 간단한 수정이 필요합니다.
- "shebang" 바로 뒤의 두 줄은 다음으로 대체됩니다.
pools_to_complete=$(wc -l infile)
- 블록 내부의 첫 번째 줄은 다음
while
과 같습니다.
pools_completed=$(grep -c "scrub repaired" < infile)
infile
배열 사용을 고집하는 경우 위의 모든 내용은 행당 또는 각 배열 구성 요소에 "scrub Repaired" 문자열의 인스턴스가 0 또는 1개만 있을 수 있다고 가정합니다. grep -c ...
검색된 패턴의 발생 횟수를 카운트하기 때문입니다 . 화타이