Câu hỏi này phát sinh từ một câu hỏi khác mà tôi đã đặt ra trên Stackoverflow . Tôi đang sử dụng Watcher - các vấn đề tương tự áp dụng cho Incron - để theo dõi một thư mục và các thư mục con của nó để thay đổi và âm thầm tìm kiếm những thay đổi đó cho Dropbox.
Tôi theo dõi write_close
sự kiện - IN_CLOSE_WRITE
- cho mục đích. Ban đầu tôi đang xem modify
sự kiện, tức là IN_MODIFY. Trong khi điều này hoạt động tôi thấy rằng khi viết các tệp lớn, nó sẽ kích hoạt nhiều lần. Điều đó nghe có vẻ công bằng vì vậy tôi đã chuyển sang IN_CLOSE_WRITE
vì tôi cảm thấy rằng thật hợp lý khi cho rằng đối với một tệp nhất định, nó sẽ chỉ xảy ra một lần.
Tuy nhiên, đó không phải là trường hợp. Ngay cả đối với một tệp văn bản rất nhỏ - chỉ một ký tự - được tạo trong Nano, sự kiện này xảy ra hai lần. Tốt nhất điều này có thể dẫn đến lưu lượng không cần thiết khi cùng một tệp được đồng bộ hóa trên Dropbox hai lần. Trong trường hợp của riêng tôi, nó dẫn đến thảm họa vì trong sự kiện đầu tiên tôi thực hiện đồng bộ hóa và sau đó xóa tệp phía máy chủ. Kết quả - trong sự kiện thứ hai, tệp bên Dropbox trở thành tệp 0 byte.
Bây giờ tôi đang xử lý vấn đề này bằng cách làm cho tập lệnh đồng bộ hóa của tôi ngủ trong 10 giây trước khi tôi làm bất cứ điều gì khác và sau đó tôi kiểm tra xem tệp đang nghi vấn có còn tồn tại trước khi thử đồng bộ hóa Dropbox không. Điều này hoạt động bởi vì ở lần lặp thứ hai, tệp bị thiếu và tập lệnh chỉ chấm dứt.
Điều này nghe có vẻ tốt nhất. Có lẽ không phải là một hack xấu nhưng tôi muốn hiểu - tại sao ngay cả IN_CLOSE_WRITE
sự kiện này xảy ra nhiều hơn một lần?
Một số thông tin bổ sung
- Kiểm tra để đảm bảo rằng không có nhiều phiên bản của trình theo dõi đang chạy.
Đầu ra từ ps ax|grep watcher.py
23880 ? Sl 0:01 python /usr/local/bin/watcher.py restart
24977 pts/0 S+ 0:00 grep --color=auto watcher.py
Hệ thống tập tin là ext4
. Tôi nên đề cập rằng tôi đã gặp chính xác vấn đề tương tự với Incron. Tôi khởi động Trình theo dõi lên từ một tập lệnh thực thi thông qua /etc/rc2.d
. Incron OTH khởi động mà không có bất kỳ sự lộn xộn nào của tôi thông qua apt-get install incron
cài đặt mặc định của nó .
Bản chất của watcher.ini
tập tin của tôi được hiển thị dưới đây.
[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid
[job1]
watch=/path/to/watch
events=write_close
excluded=
recursive=true
autoadd=true
command=/home/datastore.php $filename
Tôi đã giảm datastore.php
tập lệnh xuống mức tối thiểu để xác minh rằng nó được kích hoạt hai lần mà không có bất kỳ mã tải lên + mã xóa mã nguồn lộn xộn nào của tôi.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Sau đó tôi đã tạo ra một tập tin nhỏ ở đường dẫn trong câu hỏi và sau đó kiểm tra /tmp/watcher
. Vấn đề vẫn còn tồn tại - tệp vẫn có hai mục liên tiếp $argv[1]
.
ext4
và tôi chắc chắn rằng tôi không có hai phiên bản Watcher đang chạy. Tôi đã gặp vấn đề tương tự với Incron.
delete
thói quen và thử lại không?
unlink
vấn đề gì vẫn tồn tại