Bir txt dosyasında yalnızca varsa belirli değişiklikleri yapan bir kabuk komut dosyası üzerinde çalışıyorum, ancak bu test döngüsü çalışmıyor, nedenini merak ediyorum? Teşekkür ederim!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Bir txt dosyasında yalnızca varsa belirli değişiklikleri yapan bir kabuk komut dosyası üzerinde çalışıyorum, ancak bu test döngüsü çalışmıyor, nedenini merak ediyorum? Teşekkür ederim!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Yanıtlar:
"Çalışmıyor" dediğinizde, işe yaramadığını nasıl anlarsınız?
Ekleyerek dosyanın gerçekten var olup olmadığını anlamaya çalışabilirsiniz:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
Ayrıca, 'echo $ SHELL' yazarak bir Bash (veya ilgili) kabuğu kullandığınızdan emin olabilirsiniz. CSH ve TCSH'nin bu döngü için biraz farklı bir anlambilim kullandığını düşünüyorum.
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Linux'taysanız ve inotify-tools yüklediyseniz, bunu yapabilirsiniz:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
Bu, hala her "x" saniyede bir yoklama yaparken uykunun getirdiği gecikmeyi azaltır. Gerekli olduklarını tahmin ediyorsanız daha fazla etkinlik ekleyebilirsiniz.
--excludedosya adlarını filtrelemesi gerektiği, ancak dosya adı dışındaki--include her şeyi göz ardı etmemesi gerektiğinden . Yukarıdaki komut bunun yerine argümanı kullanmalıdır . -qq>&/dev/null
--timeoutkontrol sıklığı değil, değil mi? İnotifywait'in amacı, anket olmaması
inotifywaitbir dosya olayları dinlemeye başlamadan hemen önce oluşturulursa süresiz olarak askıda kalabilir.
Benzer bir sorunla karşılaştım ve beni buraya yönlendirdi, bu yüzden çözümümü aynı deneyimi yaşayan herkes için bırakmak istedim.
cat /tmp/list.txtİçeriğin hemen dosyaya yerleştirildiğinden emin olmama rağmen, çalıştırırsam dosyanın boş olacağını fark ettim. sleep 1;Hemen önüne bir koyarsam ortaya çıkıyorcat /tmp/list.txtBeklendiği gibi çalışmadan . Dosyanın oluşturulduğu zaman ile yazıldığı zaman arasında veya bu satırlarda bir gecikme olmuş olmalı.
Son kodum:
while [ ! -f /tmp/list.txt ];
do
sleep 1;
done;
sleep 1;
cat /tmp/list.txt;
Umarım bu, birisine sinir bozucu bir yarım saat kazandırır!
@ Zane-hooper gibi, NFS'de de benzer bir sorun yaşadım. Paralel / dağıtılmış dosya sistemlerinde, bir makinede bir dosya yaratmanız ile diğer makinenin onu "görmesi" arasındaki gecikme çok büyük olabilir, bu nedenle, while döngüsü çıkmadan önce dosyanın oluşturulmasının ardından tam bir dakika bekleyebilirim (ve zaten silinmiş bir dosyayı "görmenin" bir sonucu da vardır).
Bu , komut dosyasının "çalışmadığı" yanılsamasını yaratır , oysa aslında topu düşüren dosya sistemidir.
Bunu anlamam biraz zaman aldı, umarım birine biraz zaman kazandırır.
PS Bu ayrıca can sıkıcı sayıda "Eski dosya işleyici" hatalarına neden olur.
bash ve sh ile çalışır:
touch /tmp/testfile
sleep 10 && rm /tmp/testfile &
until ! [ -f /tmp/testfile ]
do
echo "testfile still exist..."
sleep 1
done
echo "now testfile is deleted.."
İşte zaman aşımına sahip bir sürüm, böylece belirli bir süre sonra döngü bir hatayla biter:
# After 60 seconds the loop will exit
timeout=60
while [ ! -f /tmp/list.txt ];
do
# When the timeout is equal to zero, show an error and leave the loop.
if [ "$timeout" == 0 ]; then
echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
exit 1
fi
sleep 1
# Decrease the timeout of one
((timeout--))
done
böyle yap
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt