sleepコマンドなしでbashで忙しい待機を避ける

sleepコマンドなしでbashで忙しい待機を避ける

次のようにして、bashで条件がtrueになるまで待つことができることを知っています。

while true; do
  test_condition && break
  sleep 1
done

ただし、繰り返し(睡眠)ごとに1つのサブプロセスが作成されます。次のようにすると、この問題を回避できます。

while true; do
  test_condition && break
done

しかし、CPUを多用します(Busy Waiting)。サブプロセスや忙しい待機を避けるために、次の解決策を思いつきましたが、それは見た目に悪いです。

my_tmp_dir=$(mktemp -d --tmpdir=/tmp)    # Create a unique tmp dir for the fifo.
mkfifo $my_tmp_dir/fifo                  # Create an empty fifo for sleep by read.
exec 3<> $my_tmp_dir/fifo                # Open the fifo for reading and writing.

while true; do
  test_condition && break
  read -t 1 -u 3 var                     # Same as sleep 1, but without sub-process.
done

exec 3<&-                                # Closing the fifo.
rm $my_tmp_dir/fifo; rmdir $my_tmp_dir   # Cleanup, could be done in a trap.

注:通常、read -t 1 varfifoはstdinを消費するため、fifoなしでは使用できず、stdinが端末またはパイプでない限り機能しません。

よりエレガントな方法でサブプロセスと忙しい待機を避けることはできますか?

ベストアンサー1

bash最新バージョン(最小v2)では、組み込み機能を実行時にロードできます(enable -f filename commandname. これらのロード可能な組み込み機能の多くはbashソースと共に配布され、sleepその中にあります。もちろん、可用性はオペレーティングシステムごと(マシンごとに)異なるたとえば、openSUSEでは、これらの組み込み機能はパッケージを介して配布されます。bash-loadables

おすすめ記事