Tôi đang làm việc trên một tập lệnh shell thực hiện các thay đổi nhất định trên tệp txt chỉ khi nó tồn tại, tuy nhiên, vòng lặp kiểm tra này không hoạt động, tôi tự hỏi tại sao? Cảm ơn bạn!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Tôi đang làm việc trên một tập lệnh shell thực hiện các thay đổi nhất định trên tệp txt chỉ khi nó tồn tại, tuy nhiên, vòng lặp kiểm tra này không hoạt động, tôi tự hỏi tại sao? Cảm ơn bạn!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Câu trả lời:
Khi bạn nói "không hoạt động", làm thế nào bạn biết nó không hoạt động?
Bạn có thể cố gắng tìm hiểu xem tệp có thực sự tồn tại hay không bằng cách thêm:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
Bạn cũng có thể đảm bảo rằng bạn đang sử dụng trình bao Bash (hoặc có liên quan) bằng cách nhập 'echo $ SHELL'. Tôi nghĩ rằng CSH và TCSH sử dụng một ngữ nghĩa hơi khác nhau cho vòng lặp này.
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Nếu bạn đang sử dụng linux và đã cài đặt inotify-tools, bạn có thể thực hiện việc này:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
Điều này làm giảm độ trễ do ngủ trong khi vẫn thăm dò mỗi giây "x". Bạn có thể thêm nhiều sự kiện hơn nếu bạn dự đoán rằng chúng là cần thiết.
--exclude
phải lọc ra các tên tệp, nhưng không --include
thể bỏ qua mọi thứ ngoại trừ tên tệp. Lệnh trên nên sử dụng -qq
đối số thay vì >&/dev/null
mặc dù.
--timeout
phải là tần suất kiểm tra không? Điểm của inotifywait là không có cuộc bỏ phiếu
inotifywait
có thể bị treo vô thời hạn nếu một tệp được tạo ngay trước khi nó bắt đầu lắng nghe các sự kiện.
Tôi đã gặp phải một vấn đề tương tự và nó dẫn tôi đến đây vì vậy tôi chỉ muốn để lại giải pháp của mình cho bất kỳ ai có cùng kinh nghiệm.
Tôi nhận thấy rằng nếu tôi chạy cat /tmp/list.txt
tệp sẽ trống, mặc dù tôi chắc chắn rằng có nội dung được đặt ngay trong tệp. Hóa ra nếu tôi đặt sleep 1;
ngay trước khi cat /tmp/list.txt
nó hoạt động như mong đợi. Chắc hẳn đã có một khoảng thời gian trễ giữa thời gian tệp được tạo và thời gian nó được viết, hoặc một cái gì đó dọc theo những dòng đó.
Mã cuối cùng của tôi:
while [ ! -f /tmp/list.txt ];
do
sleep 1;
done;
sleep 1;
cat /tmp/list.txt;
Hy vọng điều này sẽ giúp tiết kiệm cho ai đó nửa giờ bực bội!
Giống như @ zane-hooper, tôi đã gặp sự cố tương tự trên NFS. Trên hệ thống tệp song song / phân tán, độ trễ giữa bạn tạo tệp trên máy này và máy khác "nhìn thấy" tệp đó có thể rất lớn, vì vậy tôi có thể đợi tối đa một phút sau khi tạo tệp trước khi vòng lặp while thoát ra (và cũng có một hậu quả của việc nó "nhìn thấy" một tệp đã bị xóa).
Điều này tạo ra ảo tưởng rằng script "không hoạt động" , trong khi thực tế nó là hệ thống tập tin đang thả bóng.
Điều này khiến tôi mất một lúc để tìm ra, hy vọng nó sẽ tiết kiệm cho ai đó một chút thời gian.
PS Điều này cũng gây ra một số lỗi "Trình xử lý tệp cũ" khó chịu.
hoạt động với cả bash và sh:
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.."
Đây là phiên bản có thời gian chờ để sau một khoảng thời gian, vòng lặp kết thúc với lỗi:
# 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
làm nó như thế này
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt