Ben bash gerçek olması için bir koşul bekleyebilirsiniz biliyorum:
while true; do
test_condition && break
sleep 1
done
Ancak her bir yinelemede (uyku) 1 alt işlem oluşturur. Yaparak onlardan kaçınabilirim:
while true; do
test_condition && break
done
Ama çok fazla CPU kullanıyor (meşgul bekliyor). Alt süreçlerden ve meşgul beklemeden kaçınmak için, aşağıdaki çözümü buldum, ama çirkin buluyorum:
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.
Not: genel durumda, sadece read -t 1 var
fifo olmadan kullanamam , çünkü stdin tüketecek ve stdin bir terminal veya boru değilse işe yaramayacaktır.
Alt süreçleri ve meşgul beklemeyi daha zarif bir şekilde önleyebilir miyim?
true
, soru güncellendi.
read -t 1 var
.
sleep
ilk örnekteki gibi devam etmenizi şiddetle tavsiye ederim . İkincisi, çalışabilirken, gelecekte kimsenin ayarlaması kolay olmayacak. Basit kodun güvenli olma potansiyeli de daha yüksektir .
true
bir yerleşiktir ve bash içinde bir alt süreç oluşturmaz. meşgul beklemek her zaman kötü olacaktır.