2010-09-29 13 views
5

मेरे पास कुछ एप्लिकेशन (प्रारंभ/रोक/सूची/आदि) को नियंत्रित करने के लिए कुछ स्क्रिप्ट हैं। वर्तमान में मेरी "स्टॉप" स्क्रिप्ट सिर्फ एक एप्लिकेशन में एक इंटरप्ट सिग्नल भेजती है, लेकिन मैं बंद होने पर एप्लिकेशन के बारे में अधिक प्रतिक्रिया लेना चाहता हूं। आदर्श रूप में, मैं अपने लॉग को पूंछ करना शुरू करना चाहता हूं, फिर एक इंटरप्ट सिग्नल भेजना चाहता हूं और फिर उस लॉग को तब तक रखना जारी रखता हूं जब तक एप्लिकेशन बंद नहीं हो जाता।बैश में "उस प्रक्रिया को तब तक पूंछ कैसे करें जब तक वह प्रक्रिया बंद न हो जाए"?

शैल स्क्रिप्ट के साथ ऐसा कैसे करें?

उत्तर

10

सिर्फ एक निश्चित प्रक्रिया जब तक एक लॉग फ़ाइल पीछा के लिए बंद हो जाता है (tailसे GNU coreutils उपयोग करते हुए):

do_something > logfile & 
tail --pid $! -f logfile 

अद्यतन ऊपर एक दौड़ स्थिति हैं: मामले do_something में logfile में कई लाइनों निसृत , tail उन सभी को छोड़ देगा लेकिन अंतिम कुछ। कि से बचने के लिए और हमेशा की तरह, tail प्रिंट पूरा लॉगफ़ाइल है tail कॉल करने के लिए एक -n +1 पैरामीटर जोड़ने (जो भी POSIX tail(1) है):

do_something > logfile & 
tail --pid $! -n +1 -f logfile 
+0

बढ़िया, मैं '--pid' ध्वज के बारे में पता नहीं था! –

+0

ठीक है, उदा। पॉज़िक्स 'पूंछ 'या व्यस्त बॉक्स' पूंछ 'में' --पिड 'ध्वज नहीं है, इसलिए आप वास्तव में मौजूद होने पर व्यापक रूप से भरोसा नहीं कर सकते हैं। – ndim

+1

मैं देखता हूं, लेकिन जीएनयू कोर्यूटिल्स मेरे लिए "व्यापक रूप से" पर्याप्त है ;-) –

0

यहाँ एक बैश स्क्रिप्ट --pid के बिना काम करता है। अपनी जरूरत के अनुरूप करने के लिए $log_file और $p_name बदलें:

#!/bin/bash 

log_file="/var/log/messages" 
p_name="firefox" 

tail -n10 $log_file 
curr_line="$(tail -n1 $log_file)" 
last_line="$(tail -n1 $log_file)" 

while [ $(ps aux | grep $p_name | grep -v grep | wc -l) -gt 0 ] 
do 
     curr_line="$(tail -n1 $log_file)" 
     if [ "$curr_line" != "$last_line" ] 
     then 
       echo $curr_line 
       last_line=$curr_line 
     fi 
done 
echo "[*] $p_name exited !!" 
संबंधित मुद्दे

 संबंधित मुद्दे