Saya sedang mengerjakan skrip shell yang melakukan perubahan tertentu pada file txt hanya jika memang ada, namun loop pengujian ini tidak berfungsi, saya bertanya-tanya mengapa? Terima kasih!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Saya sedang mengerjakan skrip shell yang melakukan perubahan tertentu pada file txt hanya jika memang ada, namun loop pengujian ini tidak berfungsi, saya bertanya-tanya mengapa? Terima kasih!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Jawaban:
Ketika Anda mengatakan "tidak berhasil", bagaimana Anda tahu itu tidak berhasil?
Anda dapat mencoba mencari tahu apakah file tersebut benar-benar ada dengan menambahkan:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
Anda juga dapat memastikan bahwa Anda menggunakan shell Bash (atau terkait) dengan mengetik 'echo $ SHELL'. Saya pikir CSH dan TCSH menggunakan semantik yang sedikit berbeda untuk loop ini.
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Jika Anda menggunakan linux dan telah menginstal alat inotify, Anda dapat melakukan ini:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
Ini mengurangi penundaan yang disebabkan oleh tidur sambil tetap mengumpulkan setiap "x" detik. Anda dapat menambahkan lebih banyak acara jika Anda mengantisipasinya diperlukan.
--excludememfilter nama file, tetapi tidak --includemengabaikan semuanya kecuali nama file. Perintah di atas harus menggunakan -qqargumen daripada >&/dev/nullmeskipun.
--timeout, bukan frekuensi pemeriksaan, bukan? Inti dari inotifywait adalah bahwa tidak ada pemungutan suara
inotifywaitbisa hang tanpa batas jika file dibuat tepat sebelum mulai mendengarkan acara.
Saya mengalami masalah serupa dan itu membawa saya ke sini jadi saya hanya ingin meninggalkan solusi saya untuk siapa saja yang mengalami hal yang sama.
Saya menemukan bahwa jika saya menjalankan cat /tmp/list.txtfile tersebut akan kosong, meskipun saya yakin ada konten yang langsung ditempatkan di file. Ternyata jika saya meletakkan sleep 1;sebelum cat /tmp/list.txtitu bekerja seperti yang diharapkan. Pasti ada penundaan antara waktu file dibuat dan waktu itu ditulis, atau sesuatu seperti itu.
Kode terakhir saya:
while [ ! -f /tmp/list.txt ];
do
sleep 1;
done;
sleep 1;
cat /tmp/list.txt;
Semoga ini membantu menyelamatkan seseorang dari setengah jam yang membuat frustrasi!
Seperti @zane-hooper, saya mengalami masalah serupa di NFS. Pada filesystem paralel / terdistribusi, jeda antara Anda membuat file di satu mesin dan mesin lain "melihat" itu bisa sangat besar, jadi saya bisa menunggu hingga satu menit penuh setelah pembuatan file sebelum while loop keluar (dan ada juga efek sampingnya "melihat" file yang sudah dihapus).
Ini menciptakan ilusi bahwa skrip "tidak berfungsi" , padahal sebenarnya itu adalah sistem file yang menjatuhkan bola.
Ini membutuhkan waktu beberapa saat bagi saya untuk memikirkannya, semoga dapat menghemat waktu seseorang.
PS Ini juga menyebabkan sejumlah kesalahan "Stale file handler" yang mengganggu.
bekerja dengan bash dan sh keduanya:
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.."
Berikut adalah versi dengan batas waktu sehingga setelah beberapa waktu pengulangan berakhir dengan kesalahan:
# 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
lakukan seperti ini
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt