Unix shell脚本成功或失败时的电子邮件通知
我正在编写一个shell脚本,它基本上通过SFTP将数据文件传输到数据库服务器,然后调用pl/sql过程,将这些文件(外部表)中的数据加载到内部数据库表中 我一直在研究shell脚本中的有效异常处理,似乎只要脚本中运行返回非零exitcode的任何命令,Unix shell脚本成功或失败时的电子邮件通知,unix,sh,Unix,Sh,我正在编写一个shell脚本,它基本上通过SFTP将数据文件传输到数据库服务器,然后调用pl/sql过程,将这些文件(外部表)中的数据加载到内部数据库表中 我一直在研究shell脚本中的有效异常处理,似乎只要脚本中运行返回非零exitcode的任何命令,set-e选项就可以用来终止带有错误的脚本 因此,我的计划是创建一个脚本,其中包含需要完成的所有处理(SFTP、移动/删除文件、调用pl/sql过程等),并在脚本顶部包含set-e。我还计划在这个脚本中将输出重定向到日志文件 然后,我计划使用另一
set-e
选项就可以用来终止带有错误的脚本
因此,我的计划是创建一个脚本,其中包含需要完成的所有处理(SFTP、移动/删除文件、调用pl/sql过程等),并在脚本顶部包含set-e
。我还计划在这个脚本中将输出重定向到日志文件
然后,我计划使用另一个脚本调用主处理脚本,然后将生成的日志发送到电子邮件主题中的“成功”或“失败”指示符
在这种方法中,你们有谁能预见到什么“陷阱”吗?或者这看起来合理吗?听起来合理
您还可以做一件事,让它成为一个命令,减少脚本:
someSFTPscipt &> somelogfile.txt; if [ $? -eq 0 ]; then echo "Success"; else echo "Failure"; fi
somesftpscip&>somelogfile.txt代码>将脚本的输出重定向到日志文件
if[$?-eq 0];然后呼应“成功”;否则呼应“失败”;fi
检查它是否成功(返回0)或失败(任何其他非零值)。只需用邮件命令替换echo即可感谢所有关于这方面的反馈 我最终使用了这个“包装器”shell,它调用主处理shell。在我的特殊情况下,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_RECIPIENTS=my_email@some_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
$?
的使用有点反模式。除非您出于其他原因需要知道特定的错误代码,if scp。。。;然后…
更为惯用,甚至是scp…&&echo Success | | echo Failure
如果您的操作是单个命令。另外,使用set-e
,失败将导致脚本立即退出,因此如果您想自己处理错误,必须将其包装在条件中@Platinumonkey-我使用这些命令从另一个脚本调用我的“main_process”脚本…cd$main_DIR sh main_process.sh>results.log&&send_email SUCCESS | | send_email FAILURE
-send_email是一个函数。由于某种原因,这个过程一直悬而未决。我可以自己运行main_process.sh而没有任何问题……有什么想法吗?这表明SFTP正在挂起。设置一个超时,应该可以解决您的问题。听起来不错,但是您是否会因为收到的MSG太多而忽略FTP作业中的MSG?我以前每天有100多个作业在运行,我收到的唯一消息是我的monitorAllJobs脚本已经开始,然后结束,当然,如果有任何错误,我会收到一封单独的电子邮件。大大减少了要查看的内容量,但我也确信可以监视工作的位置。你的需求可能不同。祝你好运@谢尔特:好的观点。幸运的是,这项工作将运行一天一次。现在,如果我们进入您描述的场景,我们将不得不提出一个通知方案,就像您刚才概述的那样。谢谢。如果我删除uuencode行,代码将挂起。你能帮忙吗?@blackfury我都不记得我用这个做什么了…如果你需要帮助,最好发个问题…谢谢你。。。经过一番研究后得到了答案。实际上是我的错。你的剧本写得很好。