ดำเนินการคำสั่งเมื่อไฟล์มีการเปลี่ยนแปลง


9

ฉันมีสถานการณ์ที่ฉันกำลังอัปโหลดไฟล์. csv ไปยังโฟลเดอร์เฉพาะ / tmp / data_upload ทุกวันและไฟล์เก่าจะถูกแทนที่ด้วยไฟล์ใหม่

ฉันต้องเรียกใช้สคริปต์ Python เมื่ออัปโหลดข้อมูลแล้ว สำหรับเรื่องนี้ฉันมีความคิดที่จะสร้างงาน cron และตรวจสอบการเปลี่ยนแปลงในไฟล์ ฉันพยายามใช้ inotify แต่ฉันไม่ค่อยเข้าโดเมน Unix ฉันจะทำสิ่งนั้นได้อย่างไร

ฉันต้องรันสคริปต์ test.py เมื่อมีการเปลี่ยนแปลงวันที่ของไฟล์ในโฟลเดอร์อัพโหลดตัวอย่างเช่น / tmp / data_upload


คุณเคยดูeradman.com/entrprojectแล้วไม่ได้ลองด้วยตัวเอง แต่ดูเหมือนว่ามันอาจจะเกี่ยวข้องกัน
OO

FYI, Python มีinotifyห้องสมุดให้บริการ ดูคำตอบของฉันที่นี่เพื่อดูตัวอย่าง: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

คำตอบ:


10

คุณอาจต้อง incrond (inotify cron daemon) ซึ่งจะตรวจสอบการเปลี่ยนแปลงไฟล์และเรียกใช้สคริปต์

Incrond สามารถตรวจสอบเพิ่มไฟล์ใหม่แก้ไขลบและอื่น ๆ อีกมากมาย นี่คือบทความแสดงสิ่งที่เหตุการณ์ไม่สามารถตรวจสอบด้วยตัวอย่าง

ตัวอย่างสำหรับกรณีของคุณคุณอาจสร้างไฟล์ที่/etc/incron.d/data_uploadมีเนื้อหา

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 

2
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
เจอรัลด์ชไนเดอร์

ขอบคุณที่เตือนฉันฉันได้เพิ่มบริบทสำหรับลิงค์
victoroloan

ขอบคุณสำหรับคำตอบเพียงเพื่อตรวจสอบขั้นตอนหลังจากติดตั้ง incrontab shoudl รันincrontab -eเป็น root แล้วรวมบรรทัดนี้ /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? เพื่อที่จะตรวจสอบเมื่อฉันอัปโหลดไฟล์ใหม่ควรรันไฟล์ test.py? ฉันควรวางไฟล์ test.py ที่ไหน ฉันควรจะให้เส้นทางที่แน่นอนสำหรับเรื่องนี้หรือไม่?
Alex

1
ฉันคิดว่ามันจะดีกว่าที่จะใส่เส้นทางที่แน่นอนสำหรับสคริปต์ของคุณ นอกจากนี้คุณยังสามารถตรวจสอบ cron หรือบันทึกของระบบได้หากสคริปต์ดูเหมือนว่าใช้งานไม่ได้
victoroloan

คุณสามารถทำเอกสารไฟล์ที่คุณอ้างถึงด้วยการบล็อกรหัสของคุณคนที่ไม่คุ้นเคยกับไวยากรณ์ของ Incrond (เช่นฉัน) อาจคิดว่ากำลังอ้างถึงคำสั่งที่คุณต้องดำเนินการในบรรทัดคำสั่ง
Ferrybig

1

คุณสามารถใช้entrเพื่อเรียกใช้สคริปต์โดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลงไฟล์โดยเรียกใช้ls /tmp/data_upload | entr -p script.pyครั้งเดียวเมื่อเริ่มต้น

เว็บไซต์โครงการ: http://eradman.com/entrproject/

หน้าคนออนไลน์: https://www.systutorials.com/docs/linux/man/1-entr/


0

watchexec( https://crates.io/crates/watchexec ) บรรทัดคำสั่งเสียงยูทิลิตี้ชอบสิ่งที่คุณต้องการ แต่ผมเชื่อว่าจะติดตั้งที่คุณจะต้องมีสนิมสร้างเครื่องมือที่ติดตั้งบนเครื่องของคุณเพื่อที่อาจจะเป็น dealbreaker


1
ฉันชอบใช้ซอฟต์แวร์ที่เขียนด้วยสนิมเพราะคุณรู้ว่ามันไม่ได้ถูกทิ้งร้างในปี 2004 หรือบางอย่าง มันเกือบจะเป็นเรื่องใหม่
นาธาเนียล Pisarski

0

วิธีการทั่วไปของฉันคือการเล่นซอกับfindยูทิลิตี้Unix แบบดั้งเดิม ตัวอย่างเช่นคำสั่ง

find /tmp/upload_data/*.csv -mtime -1 -exec /home/myname/test.py

จะค้นหา.csvไฟล์ใด ๆใน/tmp/upload_dataที่ได้รับการแก้ไขน้อยกว่าหนึ่งวันที่ผ่านมาและเรียกใช้ของคุณtest.pyหากพบใด ๆ แน่นอนหากtest.pyไฟล์ของคุณอยู่ในไดเรกทอรีอื่นคุณต้องการอัปเดตพา ธ ของคุณตามนั้น

หากคุณทำงานของคุณcronบ่อยกว่าวันละครั้งคุณสามารถใช้mminตัวเลือกfindเพื่อระบุเวลาสูงสุดตั้งแต่การแก้ไขในไม่กี่นาที ตัวอย่างเช่น,

find /tmp/upload_data/*.csv -mmin -60 -exec /home/myname/test.py

จะค้นหา.csvไฟล์ที่ถูกแก้ไขน้อยกว่า 60 นาทีที่ผ่านมา - มีประโยชน์ถ้า cron รันงานรายชั่วโมง

มีคำเตือนที่เป็นธรรมสองประการ: อันดับแรกสิ่งนี้จะไม่ตรวจจับ.csvไฟล์ที่คุณลบทั้งหมด คุณอาจต้องการตรวจสอบสิ่งเหล่านี้แยกกัน ประการที่สองฉันไม่มีเวลาทดสอบสิ่งนี้ คาดว่าพิมพ์ผิดในรหัสของฉันที่คุณจะต้องแก้ปัญหาด้วยตัวเอง


1
อะไรคือสิ่งที่-cmdไวยากรณ์? IIRC findใช้เวลา-exec cmd ;...
D. Ben Knoble

ฉันได้พยายามหนึ่งนี้ก่อนที่จะโพสต์คำถามนี้นี้ทำงานไม่ถูกต้องในวันที่ 2 ระยะที่ 3 ติดต่อกันจากงาน cron
อเล็กซ์

@D Ben Knoble: ถูกต้อง ฉันผสมคำสั่ง find-internal เข้ากับคำสั่งเชลล์ แก้ไขแล้ว. ขอบคุณสำหรับการแก้ไข!
โทมัส Blankenhorn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.