プールの状態を確認するには、スクリプトを作成する必要があります。各プールは次の検査結果を返します。
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
それぞれを繰り返してスキャンが完了したことを確認する必要があります。両方が含まれている場合 スクラブ修理それでは何かをしてみてください。進行中のタスクが1つまたは2つある場合は、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
1行に1つのトレース)。
アレイを外部ファイルに置き換えるには、上記の2つの簡単な修正が必要です。
- 「shebang」の直後の2行は次のように置き換えられます。
pools_to_complete=$(wc -l infile)
- ブロック内の最初の行は次
while
のとおりです。
pools_completed=$(grep -c "scrub repaired" < infile)
infile
配列の使用に固執する場合、上記のすべては、1行あたりまたは各配列コンポーネントに「scrub Repaired」文字列のインスタンスが0または1つしかないことを前提としています。grep -c ...
検索されたパターンの発生回数をカウントするためです。ファタイ