Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix shell脚本成功或失败时的电子邮件通知_Unix_Sh - Fatal编程技术网

Unix shell脚本成功或失败时的电子邮件通知

Unix shell脚本成功或失败时的电子邮件通知,unix,sh,Unix,Sh,我正在编写一个shell脚本,它基本上通过SFTP将数据文件传输到数据库服务器,然后调用pl/sql过程,将这些文件(外部表)中的数据加载到内部数据库表中 我一直在研究shell脚本中的有效异常处理,似乎只要脚本中运行返回非零exitcode的任何命令,set-e选项就可以用来终止带有错误的脚本 因此,我的计划是创建一个脚本,其中包含需要完成的所有处理(SFTP、移动/删除文件、调用pl/sql过程等),并在脚本顶部包含set-e。我还计划在这个脚本中将输出重定向到日志文件 然后,我计划使用另一

我正在编写一个shell脚本,它基本上通过SFTP将数据文件传输到数据库服务器,然后调用pl/sql过程,将这些文件(外部表)中的数据加载到内部数据库表中

我一直在研究shell脚本中的有效异常处理,似乎只要脚本中运行返回非零exitcode的任何命令,
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我都不记得我用这个做什么了…如果你需要帮助,最好发个问题…谢谢你。。。经过一番研究后得到了答案。实际上是我的错。你的剧本写得很好。