次のようにして、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 var
fifoはstdinを消費するため、fifoなしでは使用できず、stdinが端末またはパイプでない限り機能しません。
よりエレガントな方法でサブプロセスと忙しい待機を避けることはできますか?
ベストアンサー1
bash
最新バージョン(最小v2)では、組み込み機能を実行時にロードできます(enable -f filename commandname
. これらのロード可能な組み込み機能の多くはbashソースと共に配布され、sleep
その中にあります。もちろん、可用性はオペレーティングシステムごと(マシンごとに)異なるたとえば、openSUSEでは、これらの組み込み機能はパッケージを介して配布されます。bash-loadables
。