2012-09-04 13 views
13

में फ़ाइल परिवर्तन पर प्रक्रिया को पुनरारंभ करें क्या कुछ फ़ाइलों में बदलाव होने पर प्रक्रिया को पुनरारंभ करने के लिए एक सामान्य समाधान (अधिकांश वितरण द्वारा प्रदान किए गए उपयोग के माध्यम से, या कुछ साधारण पायथन/... स्क्रिप्ट) का उपयोग करना आसान है?लिनक्स

बस watch -cmd "./the_process -arg" deps/* की तरह sth को कॉल करना अच्छा लगेगा।

अद्यतन: एक साथ प्रस्तावित inotify-उपकरणों के साथ एक साधारण खोल स्क्रिप्ट मेरी जरूरतों फिट (आदेश के लिए काम करता है w/तर्क ओ) (अच्छा!):

#!/bin/sh 
while true; do 
    [email protected] & 
    PID=$! 
    inotifywait $1 
    kill $PID 
done 
+0

क्या कोई बता सकता है कि "$!" कृपया करें (इसे Google के साथ नहीं मिला), धन्यवाद। – Lior

+1

यह पहले की प्रक्रिया शुरू की गई प्रक्रिया की आईडी देता है – Christian

+1

यदि किसी फ़ाइल सिस्टम में 'नोटाइम' विशेषता नहीं है, तो 'पहुंच' ईवेंट की वजह से लक्ष्य स्क्रिप्ट/प्रक्रिया को अनंत लूप में पुनरारंभ किया जाएगा। इसे ठीक करने के लिए, 'inotifywait -e' को $ 1' संशोधित करें, जो केवल फ़ाइल संशोधन घटनाओं पर प्रतिक्रिया करेगा। – chronos

उत्तर

11

हाँ, आप एक देख सकते हैं या inotifywatchinotify-tools से सिस्टम के माध्यम से निर्देशिका को निष्क्रिय करें।

inotifywait किसी ईवेंट का पता लगाने से बाहर निकल जाएगा। निर्देशिकाओं को रिकर्सिवली देखने के लिए -r पास करें विकल्प। उदाहरण: inotifywait -r mydirectory

आप सभी घटनाओं को देखने के बजाय देखने के लिए ईवेंट भी निर्दिष्ट कर सकते हैं। केवल फ़ाइल या निर्देशिका सामग्री के लिए प्रतीक्षा करने के लिए विकल्प -e modify विकल्प का उपयोग करें।

+0

क्या आप एक उदाहरण प्रदान कर सकते हैं? – Jon

+1

@ जोन मैंने 'inotifywait' के लिए एक उदाहरण जोड़ा है जो 'inotifywatch' की तुलना में इस कार्य के लिए बेहतर अनुकूल प्रतीत होता है। – scai

7

चेक बाहर iWatch:

घड़ी एक वास्तविक समय फाइल सिस्टम निगरानी कार्यक्रम है। यह फाइल सिस्टम में परिवर्तनों का पता लगाने और इसे तुरंत रिपोर्ट करने का एक साधन है। यह XML प्रारूप में एक साधारण कॉन्फ़िगरेशन फ़ाइल का उपयोग करता है और लिनक्स कर्नेल में फ़ाइल परिवर्तन अधिसूचना प्रणाली, इनोटिफ़ाई पर आधारित है।

से, आप फ़ाइलों को आसानी से देख सकते हैं:

iwatch /path/to/file -c 'run_you_script.sh' 
+0

शायद यह भी बेहतर जवाब है, लेकिन मैं इनोटिफी-टूल्स का उपयोग करके DIY समाधान पसंद करता हूं। – Christian

5

इस सवाल में प्रदान की जवाब पर एक सुधार है। जब कोई स्क्रिप्ट को बाधित करता है, तो रन प्रक्रिया को मारना चाहिए।

#!/bin/sh 

sigint_handler() 
{ 
    kill $PID 
    exit 
} 

trap sigint_handler SIGINT 

while true; do 
    [email protected] & 
    PID=$! 
    inotifywait -e modify -e move -e create -e delete -e attrib -r `pwd` 
    kill $PID 
done 
+1

धन्यवाद! ध्यान दें कि यदि आप पुनरारंभ करने के लिए 'कुछ फ़ाइल' स्पर्श करना चाहते हैं तो आपको '-e attrib' जोड़ना होगा। – seanf