毎秒何かを確認して印刷するためにこのループを実行しています。ただし、計算に数百ミリ秒かかることがあるため、印刷時間が1秒をスキップすることがあります。
毎秒印刷物を取得できるようにするこのようなループを作成する方法はありますか? (もちろん、ループの計算時間が1秒未満の場合:))
while true; do
TIME=$(date +%H:%M:%S)
# some calculations which take a few hundred milliseconds
FOO=...
BAR=...
printf '%s %s %s\n' $TIME $FOO $BAR
sleep 1
done
ベストアンサー1
元のコードに近づくために私がしたことは次のとおりです。
while true; do
sleep 1 &
...your stuff here...
wait # for sleep
done
これは意味を少し変更します。タスクに1秒未満がかかる場合は、1秒が経過するのを待ちます。ただし、何らかの理由でジョブが1秒以上かかる場合、より多くのサブプロセスは生成されず、絶対に終了しません。
したがって、ジョブは並列に実行されるか、バックグラウンドで実行されないため、変数は期待どおりに機能します。
他のバックグラウンドタスクも開始する場合は、そのプロセスのみを具体的wait
に待つように指示を変更する必要があります。sleep
より正確にする必要がある場合は、システムクロックに同期して、フル秒ではなくミリ秒間スリープモードに切り替えることができます。
システムクロックと同期するには?本当に分からない、愚かな試み:
基本:
while sleep 1
do
date +%N
done
出力: 003511461 010510925 016081282 021643477 028504349 03... (継続的に増加)
同期済み:
while sleep 0.$((1999999999 - 1$(date +%N)))
do
date +%N
done
出力:002648691 001098397 002514348 001293023 001679137 00...(未変更のまま)