जब लिनक्स में डायरेक्टरी की सामग्री बदल जाती है तो स्क्रिप्ट को स्वचालित रूप से कैसे चलाएं?


17

जब भी नई फाइलें एक विशेष निर्देशिका में कॉपी की जाती हैं, तो मैं स्वचालित रूप से एक स्क्रिप्ट चलाना चाहता हूं। दूसरे शब्दों में, क्या लिनक्स में बदलावों के लिए एक निर्देशिका को देखने और फिर परिवर्तन के जवाब में कुछ चलाने के लिए एक तरीका है?


इस चर्चा हर stackexchange साइट पर आयोजित किया गया है;) को देखने के superuser.com/questions/181517/... stackoverflow.com/questions/4380527/... आदि
masterxilo

जवाबों:


17

आप भाग्यशाली पर्याप्त एक डेबियन-आधारित वितरण पर होने की कर रहे हैं, apt-get install dnotify। अन्य वितरणों में शायद कुछ समान है - dnotifyनाम के लिए देखो ।

dnotify लिनक्स कर्नेल 2.4.19 + के dnotify API पर आधारित एक सरल प्रोग्राम है। किसी विशेष निर्देशिका परिवर्तन की सामग्री हर बार एक निर्दिष्ट आदेश को निष्पादित कर सकती है। यह कमांड लाइन से चलाया जाता है और दो तर्क लेता है: एक या एक से अधिक निर्देशिकाओं की निगरानी करना और जब भी कोई निर्देशिका बदल जाती है, तो निष्पादित करने के लिए एक कमांड। विकल्प नियंत्रित करते हैं कि कौन सी घटनाओं को चालू करना है: जब निर्देशिका में एक फ़ाइल पढ़ी गई थी, जब एक बनाई गई थी, हटा दी गई थी और इसी तरह।

यदि आप इसे अपने कार्यक्रम के भीतर संभालना चाहते हैं, तो dnotify वह API भी है जिसका आप उपयोग करना चाहते हैं।


4
@MikeB, आपके द्वारा सुझाए गए Googling के बाद, मैंने इसके बजाय inotify का उपयोग करके समाप्त कर दिया, जो स्पष्ट रूप से इसे आगे बढ़ाता है। मुझे सही दिशा बताने के लिए धन्यवाद। apt-get install inotify-tools
GeneQ

7
@GeneQ, inotify ने dnotify को बदल दिया है।
डेविड

1
इसी तरह emerge inotify-tools
जेंटू

हाँ, मैं कहने जा रहा था, कर्नेल 2.4.19 प्राचीन की तरह है ;-) inotify जाने का रास्ता है।
डेविड जेड

ओह, हाँ ... मैं भूल गया था जो हाल ही में था :)
मिकीबी

12

आप एक स्क्रिप्ट को इनोटिफ़ाइ-टूल्स के साथ चला सकते हैं, कुछ इस तरह से। यह संशोधित फ़ाइलों, नई फ़ाइलों और हटाई गई फ़ाइलों में परिवर्तन के लिए निर्देशिका देखेगा, फिर यह स्क्रिप्ट निष्पादित करेगा।

#!/bin/sh
while inotifywait -e modify -e create -e delete /home/me/code; do
    rsync [options] /home/me/code/ /media/nfs/code/ 
done

बस इस बात का ध्यान रखें कि यदि प्रतिलिपि बनाते समय स्रोत निर्देशिका बदलती है, तो inotifywait इसे नहीं देखेगा और उन परिवर्तनों को तब तक कॉपी नहीं किया जाएगा जब तक कि प्रतिलिपि समाप्त नहीं हो जाती। शायद एक मुद्दा नहीं है, हालांकि।
राउल सालिनास-मोंटियागुडो

आप इसे डेमॉन मोड में कैसे चला सकते हैं?
क्रिस एफ

4

incron मूल रूप से आप क्या चाहते हैं, मुझे लगता है। यह सूचना तंत्र के रूप में (जो, जैसा कि दूसरों ने बताया है, सुपरनोट डेंक्टीज़) का उपयोग करने के लिए inotify का उपयोग करता है, लेकिन एक स्क्रिप्ट की आवश्यकता नहीं है जो लगातार चलती है, inotifywait या इसी तरह का उपयोग करते हुए (हालांकि, जाहिर है, incron डेमन हर समय चल रहा है)। सिस्टम-वाइड 'crontabs' और उपयोगकर्ता 'crontabs' को मानक cron के समान तरीके से समर्थन किया जाता है, लेकिन समय को ट्रिगर के रूप में निर्दिष्ट करने के बजाय, घटनाओं और फ़ाइलों / निर्देशिका नामों का उपयोग किया जाता है।

मुझे लगता है कि उबंटू और डेबियन सहित कई वितरणों के लिए इन्क्रॉन पैक किया गया है।


0

इस उद्देश्य के लिए पूरी तरह से सॉफ़्टवेयर का एक टुकड़ा है, autoenv आप इसे जांचना चाहते हैं।


0

entr सबसे सरल और सबसे अधिक योग्य फ़ाइल सूचना उपकरण है जिसे मैंने देखा है। इसका उपयोग निर्देशिकाओं के बजाय फ़ाइलों को देखने के लिए अनुकूलित है, लेकिन यह आपके मामले को भी हल कर सकता है।

अतिरिक्त फ़ाइल का पता लगाने और उस पर कार्रवाई करने के लिए, इसे अन्य उपकरणों जैसे उदाहरण के साथ संयोजित करें makeentrनाम या ऐसा कुछ भी नहीं भेजता है, यह केवल वही चलाता है जो आपने इसे चलाने के लिए कहा था।

किसी निर्देशिका में जोड़ी गई फ़ाइलों की जाँच करने के लिए:

## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done

यदि आप मौजूदा फ़ाइल में परिवर्तन होने पर भी कार्य करना चाहते हैं:

## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
    entr -d do_stuff
do sleep 1; done

... और यह वह जगह है जहाँ लूप तंत्र काम में आता है, क्योंकि findयदि कोई फ़ाइल जोड़ी जाती है, तो अभिव्यक्ति फिर से चलेगी।

यदि आप बेहतर त्रुटि से निपटना चाहते हैं और यह सुनिश्चित करना चाहते हैं कि जोड़े गए / हटाए गए फ़ाइल के अनुसार चीजें केवल एक बार चलें, तो चीजें थोड़ी विचित्र हो जाती हैं, लेकिन इन सरल मामलों के लिए यह शानदार है।


संपादित करें: यदि आप एक प्रणाली स्तर पर यह करने के लिए चाहते हैं, की तरह कुछ incron , बस स्क्रिप्ट अपने पसंदीदा प्रक्रिया प्रबंधक (जैसे जोड़ने S6 , RUNIT , systemd या sysvinit और पाश छोड़:

#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)

execऔर इस प्रक्रिया प्रतिस्थापन ( <(...)) महत्वपूर्ण है जब एक प्रक्रिया प्रबंधक से चल रहा है, ठीक से संकेत को संभालने के लिए कर रहे हैं (यानी रास्ते से बाहर खोल पाने के लिए)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.