簡體   English   中英

如何處理shell腳本中的錯誤/異常?

[英]How to handle error/exception in shell script?

下面是我在bash中執行的腳本。 它工作正常。

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

問題陳述:-

在上面的shell腳本中,必須每天使用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我的腳本中get notified if anything wrong has happened ,我有什么方法可以get notified if anything wrong has happened嗎? 假設cluster is having some maintenance正在進行cluster is having some maintenance ,那時我正在運行我的腳本,所以肯定會失敗肯定,所以如果上面的腳本失敗,我可以得到通知,這樣我就可以確定發生了什么錯誤。

希望我的問題很清楚。

任何想法將不勝感激。

您可以檢查每個命令的退出狀態,如freetx所述,但這是手動錯誤檢查而不是異常處理。 sh獲得等效異常處理的標准方法是使用set -e啟動腳本。 一旦任何執行的命令失敗(即退出具有非零退出狀態),這告訴sh以非零狀態退出。

如果打算讓這樣的腳本中的某些命令(可能)失敗,可以使用構造COMMAND || true 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

確保在cron調用的腳本中出現問題時通知您的另一種方法是遵守Unix慣例, 除非出現錯誤,否則不打印任何內容 成功的運行將在沒有通知的情況下通過,並且不成功的運行將導致cron守護程序通過電子郵件通知您錯誤。 請注意,必須在系統上正確配置本地郵件傳遞才能使其正常工作。

按慣例,每個unix命令行實用程序在成功時返回0,在失敗時返回非零。 因此你可以使用$? 模式顯示最后一個返回值並相應地處理事物。

例如:

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

因此,您可以將其用作基本錯誤檢測,以查看是否出現問題。 所以通常的做法是

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

好吧,如果其他腳本在同一台機器上,那么你可以在其他腳本中為這個腳本做一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM