जब भी नई फाइलें एक विशेष निर्देशिका में कॉपी की जाती हैं, तो मैं स्वचालित रूप से एक स्क्रिप्ट चलाना चाहता हूं। दूसरे शब्दों में, क्या लिनक्स में बदलावों के लिए एक निर्देशिका को देखने और फिर परिवर्तन के जवाब में कुछ चलाने के लिए एक तरीका है?
जब भी नई फाइलें एक विशेष निर्देशिका में कॉपी की जाती हैं, तो मैं स्वचालित रूप से एक स्क्रिप्ट चलाना चाहता हूं। दूसरे शब्दों में, क्या लिनक्स में बदलावों के लिए एक निर्देशिका को देखने और फिर परिवर्तन के जवाब में कुछ चलाने के लिए एक तरीका है?
जवाबों:
आप भाग्यशाली पर्याप्त एक डेबियन-आधारित वितरण पर होने की कर रहे हैं, apt-get install dnotify
। अन्य वितरणों में शायद कुछ समान है - dnotify
नाम के लिए देखो ।
dnotify लिनक्स कर्नेल 2.4.19 + के dnotify API पर आधारित एक सरल प्रोग्राम है। किसी विशेष निर्देशिका परिवर्तन की सामग्री हर बार एक निर्दिष्ट आदेश को निष्पादित कर सकती है। यह कमांड लाइन से चलाया जाता है और दो तर्क लेता है: एक या एक से अधिक निर्देशिकाओं की निगरानी करना और जब भी कोई निर्देशिका बदल जाती है, तो निष्पादित करने के लिए एक कमांड। विकल्प नियंत्रित करते हैं कि कौन सी घटनाओं को चालू करना है: जब निर्देशिका में एक फ़ाइल पढ़ी गई थी, जब एक बनाई गई थी, हटा दी गई थी और इसी तरह।
यदि आप इसे अपने कार्यक्रम के भीतर संभालना चाहते हैं, तो dnotify वह API भी है जिसका आप उपयोग करना चाहते हैं।
emerge inotify-tools
आप एक स्क्रिप्ट को इनोटिफ़ाइ-टूल्स के साथ चला सकते हैं, कुछ इस तरह से। यह संशोधित फ़ाइलों, नई फ़ाइलों और हटाई गई फ़ाइलों में परिवर्तन के लिए निर्देशिका देखेगा, फिर यह स्क्रिप्ट निष्पादित करेगा।
#!/bin/sh
while inotifywait -e modify -e create -e delete /home/me/code; do
rsync [options] /home/me/code/ /media/nfs/code/
done
incron मूल रूप से आप क्या चाहते हैं, मुझे लगता है। यह सूचना तंत्र के रूप में (जो, जैसा कि दूसरों ने बताया है, सुपरनोट डेंक्टीज़) का उपयोग करने के लिए inotify का उपयोग करता है, लेकिन एक स्क्रिप्ट की आवश्यकता नहीं है जो लगातार चलती है, inotifywait या इसी तरह का उपयोग करते हुए (हालांकि, जाहिर है, incron डेमन हर समय चल रहा है)। सिस्टम-वाइड 'crontabs' और उपयोगकर्ता 'crontabs' को मानक cron के समान तरीके से समर्थन किया जाता है, लेकिन समय को ट्रिगर के रूप में निर्दिष्ट करने के बजाय, घटनाओं और फ़ाइलों / निर्देशिका नामों का उपयोग किया जाता है।
मुझे लगता है कि उबंटू और डेबियन सहित कई वितरणों के लिए इन्क्रॉन पैक किया गया है।
entr सबसे सरल और सबसे अधिक योग्य फ़ाइल सूचना उपकरण है जिसे मैंने देखा है। इसका उपयोग निर्देशिकाओं के बजाय फ़ाइलों को देखने के लिए अनुकूलित है, लेकिन यह आपके मामले को भी हल कर सकता है।
अतिरिक्त फ़ाइल का पता लगाने और उस पर कार्रवाई करने के लिए, इसे अन्य उपकरणों जैसे उदाहरण के साथ संयोजित करें make
। entr
नाम या ऐसा कुछ भी नहीं भेजता है, यह केवल वही चलाता है जो आपने इसे चलाने के लिए कहा था।
किसी निर्देशिका में जोड़ी गई फ़ाइलों की जाँच करने के लिए:
## 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
और इस प्रक्रिया प्रतिस्थापन ( <(...)
) महत्वपूर्ण है जब एक प्रक्रिया प्रबंधक से चल रहा है, ठीक से संकेत को संभालने के लिए कर रहे हैं (यानी रास्ते से बाहर खोल पाने के लिए)।