2012-02-22 74 views
0

我正在編寫一個基本上通過SFTP將數據文件傳輸到數據庫服務器的shell腳本,然後調用將這些文件(外部表)中的數據加載到內部的pl/sql過程數據庫表。成功或失敗時的shell腳本電子郵件通知

我一直在研究shell腳本中有效的異常處理,並且看起來set -e選項可以用來在腳本運行時返回一個非零的退出碼的任何命令時用一個錯誤終止腳本。

因此,我的計劃是要有一個腳本,其中包含所有需要完成的處理(SFTP,移動/刪除文件,調用pl/sql程序等),並在頂部包含set -e的腳本。我還計劃將輸出重定向到此腳本中的日誌文件。

然後,我打算讓另一個腳本調用主處理腳本,然後通過電子郵件主題中的「成功」或「失敗」指示器發送日誌。

在這種方法中您是否可以預見到任何「陷阱」,或者這看起來是否合理?

+1

聽起來不錯,但是您是否冒着忽略來自FTP作業的信息的風險,因爲它們太多了?我曾經有一天運行100多個工作,而我得到的唯一信息是我的monitorAllJobs腳本已經啓動,然後結束,當然如果有任何錯誤,我會另外收到一封有關這方面的電子郵件。大大減少了看看的東西,但我也確定監視哪裏工作。您的需求可能不同。祝你好運! – shellter 2012-02-22 16:28:51

+0

@shellter - 好點。對我來說幸運的是,這項工作將每天運行一次。現在,如果我們進入你描述的場景,我們將不得不提出一個類似你剛纔概述的通知方案。謝謝。 – 2012-02-22 16:53:31

回答

0

感謝您對此的所有反饋。

我結束了與這個「包裝」外殼,調用主要的處理外殼。一個cron將在我的特定情況下每天發佈這個。

如果可以改進,評論當然是受歡迎的。

#!/bin/sh 
################################################################################ 
# Author  : Zack Macomber             # 
# Date  : 02/22/2012              # 
# Description: Calls main_process.sh and emails results of the process.  # 
#    Also appends to master log file         # 
################################################################################ 

# Flag any errors that occur during processing 
set -e 

# Set newly created files to "rw" for everyone 
umask 111 

############# 
# VARIABLES # 
############# 
[email protected]_domain.com 
MAIN_DIR=/scripts/ 

############# 
# FUNCTIONS # 
############# 
send_email() 
{ 
    uuencode results.log results.log | \ 
    mailx -s "DATA_LOAD $1 - consult attached log for details" $EMAIL_RECIPIENTS 
} 

################ 
# MAIN PROCESS # 
################ 

cd $MAIN_DIR 
sh main_process.sh > results.log && send_email SUCCESS || send_email FAILURE 
cat results.log >> pub_data_load.log 

exit 0 
+0

如果我刪除uuencode行,則代碼會掛起。你能幫我嗎? – blackfury 2016-04-08 05:27:30

+0

@blackfury我什至不記得我使用這個...可能最好張貼一個問題,如果你需要幫助... – 2016-04-08 19:10:10

+0

謝謝...經過一些研究後得到了答案。其實我的錯誤。你的劇本效果很好。 – blackfury 2016-04-09 11:37:51

1

聽起來很合理。

有一件事你也可以這樣做使一個命令和更少的腳本:

someSFTPscipt &> somelogfile.txt; if [ $? -eq 0 ]; then echo "Success"; else echo "Failure"; fi 
  1. someSFTPscipt &> somelogfile.txt;重定向腳本的輸出到一個日誌文件
  2. if [ $? -eq 0 ]; then echo "Success"; else echo "Failure"; fi檢查它是否成功(返回0)或失敗(任何其他非零值)。只需用您的郵件命令替換回顯。
+1

'$?'的使用有點反模式。除非你需要知道其他原因的具體錯誤代碼,否則'如果scp ...;那麼......'更具慣用性,甚至'scp ... && echo成功||回聲失敗',如果你的行動是單一的命令。 – tripleee 2012-02-22 15:02:37

+0

另外,使用'set -e',失敗會導致腳本立即退出,所以如果你想自己做錯誤處理,你*有*將它包裝在條件中。 – tripleee 2012-02-22 15:04:37

+0

@tripleee是的,這種方法是可讀性更強 – platinummonkey 2012-02-22 15:05:34

相關問題