คำถามนี้เกิดขึ้นจากอีกคนหนึ่งที่ผมได้ถูกวางบนStackoverflow ฉันกำลังใช้Watcher - ปัญหาเดียวกันนี้นำไปใช้กับIncron - เพื่อตรวจสอบโฟลเดอร์และโฟลเดอร์ย่อยสำหรับการเปลี่ยนแปลงและกระรอกการเปลี่ยนแปลงเหล่านั้นไปยัง Dropbox อย่างเงียบ ๆ
ฉันตรวจสอบwrite_close
เหตุการณ์ - IN_CLOSE_WRITE
- เพื่อวัตถุประสงค์ เดิมทีฉันกำลังดูmodify
เหตุการณ์เช่น IN_MODIFY ขณะนี้ใช้งานได้ฉันพบว่าเมื่อเขียนไฟล์ขนาดใหญ่มันจะเริ่มทำงานมากกว่าหนึ่งครั้ง ฟังดูเป็นธรรมดังนั้นฉันจึงเปลี่ยนไปIN_CLOSE_WRITE
เพราะฉันรู้สึกว่ามันยุติธรรมพอสมควรที่จะคิดว่าสำหรับไฟล์ที่กำหนดมันจะเกิดขึ้นเพียงครั้งเดียวเท่านั้น
อย่างไรก็ตามนั่นไม่ใช่กรณี แม้แต่ไฟล์ข้อความขนาดเล็กมาก - เพียงตัวเดียว - สร้างขึ้นใน Nano เหตุการณ์นี้เกิดขึ้นสองครั้ง ที่สุดสิ่งนี้อาจส่งผลให้เกิดการรับส่งข้อมูลที่ไม่จำเป็นเมื่อมีการซิงโครไนซ์ไฟล์เดียวกันบน Dropbox สองครั้ง ในกรณีของฉันเองมันนำไปสู่ความเสียหายจากเหตุการณ์ครั้งแรกที่ฉันทำการซิงโครไนซ์แล้วลบไฟล์ฝั่งเซิร์ฟเวอร์ ผลลัพธ์ - ในเหตุการณ์ที่สองไฟล์ด้าน Dropbox จะกลายเป็นไฟล์ 0 ไบต์
ฉันกำลังจัดการกับสิ่งนี้ในตอนนี้ด้วยการทำให้สคริปต์การซิงโครไนซ์สลีปเป็นเวลา 10 วินาทีก่อนที่ฉันจะทำอย่างอื่นจากนั้นฉันจะตรวจสอบว่าไฟล์ที่เป็นปัญหานั้นยังคงมีอยู่ก่อนที่จะพยายามซิงค์ Dropbox วิธีนี้ใช้งานได้เนื่องจากการทำซ้ำครั้งที่สองไฟล์จะหายไปและสคริปต์จะหยุดทำงาน
ฟังดูดีที่สุด อาจไม่ใช่แฮ็คที่ไม่ดี แต่ฉันอยากจะเข้าใจ - ทำไมถึงIN_CLOSE_WRITE
เกิดเหตุการณ์มากกว่าหนึ่งครั้ง?
ข้อมูลเพิ่มเติมบางส่วน
- ตรวจสอบเพื่อให้แน่ใจว่าไม่มี Watcher ทำงานอยู่หลายอินสแตนซ์
ผลผลิตจาก 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
ext4
ระบบไฟล์ ฉันควรพูดถึงว่าฉันได้พบปัญหาเดียวกันกับ Incron ฉันจะเริ่มต้นภูต Watcher /etc/rc2.d
ขึ้นจากสคริปต์ชุดดำเนินการผ่าน Incron OTH เริ่มต้นขึ้นโดยไม่ยุ่งกับฉันผ่านการapt-get install incron
ติดตั้งเริ่มต้น
สาระสำคัญของwatcher.ini
ไฟล์ของฉันแสดงอยู่ด้านล่าง
[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
ฉันลดdatastore.php
สคริปต์เป็นสิ่งจำเป็นที่เปลือยเปล่าเพื่อตรวจสอบว่ามีการเปิดขึ้นสองครั้งโดยไม่มีการอัปโหลด Dropbox + ซอร์สโค้ดของฉันที่ยุ่งเหยิง
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
จากนั้นผมก็สร้างไฟล์เล็ก ๆ น้อย ๆ /tmp/watcher
ที่เส้นทางในคำถามแล้วตรวจสอบ ปัญหายังคงอยู่ - $argv[1]
ไฟล์ยังคงมีรายการที่สองต่อเนื่องสำหรับ
ext4
และฉันแน่ใจว่าฉันไม่มี Watcher สองอินสแตนซ์ทำงานอยู่ ฉันพบปัญหาเดียวกันกับ Incron
delete
รูทีนแล้วลองอีกครั้งได้ไหม
unlink
ยังคงมีปัญหาอยู่