2012-09-08 7 views
6

नीचे मेरी लिपि है कि मैं बैश में निष्पादित कर रहा हूं। और यह ठीक काम करता है।शैल स्क्रिप्ट में त्रुटि/अपवाद को कैसे संभालें?

fileexist=0 
for i in $(ls /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done); do 
    mv /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done /data/read-only/clv/daily/archieve-wip/ 
    fileexist=1 
done 

समस्या वक्तव्य: -

मेरे ऊपर खोल स्क्रिप्ट जो cron job का उपयोग कर दैनिक चलाने के लिए होती है, मैं किसी भी error/exception handling mechanism जरूरत नहीं है। मान लीजिए कि कुछ गलत हो जाता है तो मुझे नहीं पता कि क्या हुआ है?

उपर्युक्त स्क्रिप्ट निष्पादित होने के बाद, some other scripts that will be dependent on the data provided by above script हैं, इसलिए मुझे हमेशा उन लोगों से शिकायत मिलती है जो मेरे स्क्रिप्ट डेटा के आधार पर कुछ गलत हो गए हैं।

तो क्या कोई तरीका है कि मैं अपनी स्क्रिप्ट में get notified if anything wrong has happened कर सकता हूं? मान लीजिए कि cluster is having some maintenance और उस समय मैं अपनी स्क्रिप्ट चला रहा हूं, इसलिए निश्चित रूप से यह निश्चित रूप से विफल रहेगा, इसलिए यदि मेरी उपरोक्त स्क्रिप्ट विफल हो गई हैं, तो मुझे सूचित किया जा सकता है, ताकि मैं सुनिश्चित कर सकूं कि कुछ गलत हुआ है।

आशा है कि मेरा प्रश्न पर्याप्त स्पष्ट है।

किसी भी विचार की सराहना की जाएगी।

+0

@ लेवन, हो गया। अब यह बेहतर है? – ferhan

+0

हां, मुझे लगता है कि यह बहुत बेहतर और अधिक पठनीय दिखता है, संभावित सहायकों को डर नहीं देगा :) – Levon

+0

Yup .. सलाह के लिए धन्यवाद। मैं निश्चित रूप से सुनिश्चित करने के लिए अगली बार सुनिश्चित करूँगा। :) – ferhan

उत्तर

11

आप प्रत्येक आदेश के निकास की स्थिति के लिए जाँच कर सकते हैं के रूप में freetx जवाब के लिए परिणाम अगर यह यह पाता है नहीं तो भेजता है, लेकिन यह है अपवाद हैंडलिंग के बजाय मैन्युअल त्रुटि जांच। sh में अपवाद हैंडलिंग के बराबर प्राप्त करने का मानक तरीका set -e के साथ स्क्रिप्ट शुरू करना है। यह sh को गैर-शून्य स्थिति से बाहर निकलने के लिए बताता है जैसे ही कोई निष्पादित आदेश विफल रहता है (यानी गैर-शून्य निकास स्थिति से बाहर निकलता है)।

यदि यह ऐसी स्क्रिप्ट में संभवतः विफल होने के लिए कुछ आदेशों के लिए है, तो आप COMMAND || true निर्माण का उपयोग कर सकते हैं, जो उस अभिव्यक्ति के लिए शून्य निकास स्थिति को मजबूर करेगा।उदाहरण के लिए:

#!/bin/sh 

# if any of the following fails, the script fails 
set -e 
mkdir -p destdir/1/2 
mv foo destdir/1/2 
touch /done || true # allowed to fail 

एक और तरीका है सुनिश्चित करें कि आप जब चीजें एक स्क्रिप्ट क्रॉन द्वारा लाया में गलत printing nothing unless an error ocurred की यूनिक्स सम्मेलन का पालन करने के लिए है सूचना दी जाती है। सफल रन तब बिना किसी सूचना के पास होंगे, और असफल रन क्रॉन डिमन को ईमेल के माध्यम से त्रुटि के बारे में सूचित करने का कारण बनेंगे। ध्यान दें कि इस काम के लिए स्थानीय मेल वितरण को आपके सिस्टम पर सही तरीके से कॉन्फ़िगर किया जाना चाहिए।

5

प्रत्येक यूनिक्स कमांड लाइन उपयोगिता के लिए इसकी परंपरागत सफलता पर 0 और विफलता पर शून्य-शून्य करने के लिए इसकी परंपरागत है। तो आप $ का उपयोग कर सकते हैं? अंतिम वापसी मूल्य प्रदर्शित करने के लिए पैटर्न और तदनुसार चीजों को संभाल लें।

उदाहरण के लिए:

> ls 
> file1 file2 
> echo $? 
> 0 
> ls file.no.exist 
> echo $? 
> 1 

इसलिए, आप कुछ गलत हो जाता है, तो देखने के लिए इस रूप में अल्पविकसित त्रुटि का पता लगाने का उपयोग कर सकते हैं। तो सामान्य दृष्टिकोण होगा

some_command 
if [ $? -gt 0 ] 
then 
handle_error here 
fi 
+4

असल में लिखने का मूर्ख तरीका है 'अगर! some_command; फिर '... बहुत से लोगों को यह एहसास नहीं होता है कि' if' का एकमात्र उद्देश्य कमांड चलाने और सफलता या विफलता स्थिति के लिए अपने निकास कोड की जांच करना है। – tripleee

0

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

स्क्रिप्ट एक और मशीन पर है या यहां तक ​​कि स्थानीय अन्य विधि, जिसे अन्य स्क्रिप्ट की जांच कर सकते स्थिति यानी चलाने वाले चल http ब्राउज़र के माध्यम से सुलभ दूरस्थ मशीन पर एक अस्थायी फ़ाइल बनाने के लिए या पूर्ण

तुम भी या तो रैप कर सकता है एक और चारों ओर स्क्रिप्ट कि इन त्रुटियों और ईमेल के लिए लगता है कि आप सामान्य के अनुसार जो कभी

go=0; 
function check_running() { 

     running=`pgrep -f your_script.sh|wc -l ` 
    if [ $running -gt 1 ]; then 
     echo "already running $0 -- instances found $running "; 
     go=1; 
} 

check_running; 
if [ $go -ge 1 ];then 
     execute your other script 
else 
    sleep 120; 
    check_running; 
fi 
संबंधित मुद्दे