2012-12-21 13 views
14

मैं निम्नलिखित बातें करने की जरूरत है एक विशेष समय के लिए एक विशिष्ट स्ट्रिंग के लिए एक लॉग फ़ाइल यकीन है कि मेरे आवेदन सर्वरशैल पूंछ को कार्य करना

  1. पूंछ एक विशिष्ट स्ट्रिंग
  2. अवरुद्ध रहो के लिए एक लॉग फ़ाइल है जब तक कि स्ट्रिंग
  3. हालांकि छपा है यदि स्ट्रिंग के बारे में 20 मिनट के लिए मुद्रित नहीं है छोड़ दी और फेंक और जैसे अपवाद संदेश तो स्ट्रिंग छपा है में लॉग फ़ाइल छोड़ने
  4. "सर्वर अधिक है कि 20 मिनट तक हो लिया" लूप और आगे बढ़ें।

क्या थोड़ी देर में समय बहिष्कार शामिल करने का कोई तरीका है?

उत्तर

10
#!/bin/bash 
tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var 
[ $? -eq 0 ] && echo 'ok' || echo 'server not up' 

यह लॉगफाइल पर लिखे गए कुछ भी पढ़ता है, निश्चित_वर्ड की खोज करता है, अगर सभी अच्छा है तो echos ठीक है, अन्यथा 1200 सेकेंड (20 मिनट) प्रतीक्षा करने के बाद यह शिकायत करता है।

+0

नाइस ... पढ़ने के बारे में पता नहीं था –

+0

जिम, क्या आप समझा सकते हैं कि 'read -t 1200 dummy_var' क्या कर रहा है? – pup784

+0

'defin_word' पढ़ने के लिए 20 मिनट प्रतीक्षा कर रहे हैं –

0

आप खोल स्क्रिप्ट से सिग्नल हैंडलर का उपयोग कर सकते हैं (http://www.ibm.com/developerworks/aix/library/au-usingtraps/index.html देखें)।

मूल रूप से, आप एक समारोह को परिभाषित करना चाहते हैं, पर कहा जा कहते हैं, संकेत 17, तो पृष्ठभूमि में एक सब-स्क्रिप्ट कुछ बाद में है कि संकेत भेज देंगे कि डाल:

timeout(pid) { 
    sleep 1200 
    kill -SIGUSR1 $pid 
} 

watch_for_input() { 
    tail -f file | grep item 
} 

trap 'echo "Not found"; exit' SIGUSR1 
timeout($$) & 
watch_for_input 

तो अगर आप 1200 सेकंड तक पहुँचने, अपने समारोह कहा जाता है और आप

+0

मैं आयकर नीचे पढ़ के लिए मतदान कर रहा हूँ व्यापक रूप से उपलब्ध है ... मेरा इस सरल किसी कार्य के लिए एक बहुत अधिक परेशानी की आवश्यकता है ... –

1

आप इसे इस तरह से कर सकते हैं (अपने पूंछ/ग्रेप कॉम्बो इसी क्रम में यह को मारने के लिए अपने पैटर्न के लिए देख रहा है संकेत की तरह) क्या करना है कर सकते हैं:

start_time=$(date +"%s") 
while true 
do 
    elapsed_time=$(($(date +"%s") - $start_time)) 
    if [[ "$elapsed_time" -gt 1200 ]]; then 
     break 
    fi 
    sleep 1 
    if [[ $(grep -c "specific string" /path/to/log/file.log) -ge 1 ]]; then 
     break 
    fi 
done 
+0

बहुत डिस्क अपमानजनक लॉग फ़ाइल बड़ी है अगर या तेजी से बढ़ रहा है। –

0
time=0 
found=0 
while [ $time -lt 1200 ]; do 
    out=$(tail logfile) 
    if [[ $out =~ specificString ]]; then 
    found=1 
    break; 
    fi 
    let time++ 
    sleep 1 
done 
echo $found 
+0

यह फ़ाइल काम नहीं करेगा अगर फ़ाइल तेजी से बढ़ रही है ... आप लाइनों को याद करेंगे –

+0

यह एक स्लाइडिंग विंडो समस्या पेश कर सकता है क्योंकि 'नींद 1' के अलावा अन्य निर्देश भी निष्पादन समय लेते हैं। –

+0

मुझे नहीं लगता कि हम यहां वास्तविक समय सटीकता से निपट रहे हैं। और हाँ लॉगर आउटपुट तेज होने पर यह याद आ सकता है लेकिन इसे आवश्यकताओं के आधार पर तय किया जा सकता है। – perreal

0

स्वीकार किए जाते हैं जवाब काम नहीं करता है और बाहर निकलने के कभी नहीं होगा (क्योंकि read -t बाहर निकलता है althouth, पूर्व पाइप आदेश (tail -f | grep) केवल read -t बाहर निकलने की सूचना दी जाएगी, जब वे उत्पादन है, जो जब तक कभी नहीं होता है लिखने की कोशिश स्ट्रिंग मैचों)।

एक लाइनर संभवतः व्यवहार्य है, लेकिन यहां लिखित (कामकाजी) दृष्टिकोण हैं। लॉजिक प्रत्येक के लिए समान है, वे टाइमआउट के बाद वर्तमान स्क्रिप्ट को समाप्त करने के लिए kill का उपयोग करते हैं। पर्ल शायद एक से अधिक gawk/read -t

#!/bin/bash 

FILE="$1" 
MATCH="$2" 

# Uses read -t, kill after timeout 
#tail -f "$F" | grep "$MATCH" | (read -t 1 a ; kill $$) 

# Uses gawk read timeout ability (not available in awk) 
#tail -f "$F" | grep "$MATCH" | gawk "BEGIN {PROCINFO[\"/dev/stdin\", \"READ_TIMEOUT\"] = 1000;getline < \"/dev/stdin\"; system(\"kill $$\")}" 

# Uses perl & alarm signal 
#tail -f "$F" | grep "$MATCH" | perl -e "\$SIG{ALRM} = sub { `kill $$`;exit; };alarm(1);<>;" 
संबंधित मुद्दे