【问题标题】:How to send an email from unix script如何从 Unix 脚本发送电子邮件
【发布时间】:2011-04-19 09:55:50
【问题描述】:
#! /bin/bash
`sqlplus -s <username>/<passwd>@dbname` << EOF   
set echo on  
set pagesize 0  
set verify off  
set lines 32000  
set trimspool on  
set feedback off  
`SELECT   starts_with, SUM (total_records) total_records
    FROM (SELECT ID,
                 (CASE WHEN ID LIKE '2%'  THEN '2____'
                       WHEN ID LIKE '3%'  THEN '3____'
                       WHEN ID LIKE '99%' THEN '99____'
                  END
                 ) starts_with,
                 total_records
            FROM tr
            where ( id like '2%' or id like '3%' or id like '99%'))
               WHERE tr.TIMESTAMP > SYSDATE - 75 / 1440
               AND tr.TIMESTAMP <= SYSDATE - 15 / 1440
GROUP BY starts_with;
`  
exit;  
EOF

1.首先,如何安排脚本在每 1 小时后运行一次?

2.其次,要求发送电子邮件的条件如下:

如果 total_records 一旦 total_records 大于 1,就会再次向 xyz@mail.com 发送 DOWN ALERT 通知电子邮件。

注意:直到 total_records > 1,没有这样的事情(pt.2)被遵循。只有当total_records

这里,total_records 代表交易,所以它每小时都会改变(正如tr.TIMESTAMP 所表示的那样)。 tr 表示事务表。

【问题讨论】:

    标签: bash email shell cron


    【解决方案1】:

    要在 0 分钟标记处每小时运行一次脚本,请向您的 crontab 添加一个条目,如下所示:

    • 输入 crontab -e 以编辑您的 crontab。
    • 然后添加以下行并保存 crontab:

      0 * * * * myscript.sh > myscript.log
      

    现在,您需要根据自己的情况确定是否应该发送电子邮件。一种方法是将 SQL 命令的输出写入如下文件:

    #! /bin/bash
    `sqlplus -s <username>/<passwd>@dbname` << EOF > sql.out  
    set echo on  
    set pagesize 0  
    set verify off  
    set lines 32000  
    set trimspool on  
    set feedback off  
    `SELECT   starts_with, SUM (total_records) total_records
        FROM (SELECT ID,
                     (CASE WHEN ID LIKE '2%'  THEN '2____'
                           WHEN ID LIKE '3%'  THEN '3____'
                           WHEN ID LIKE '99%' THEN '99____'
                      END
                     ) starts_with,
                     total_records
                FROM tr
                where ( id like '2%' or id like '3%' or id like '99%'))
                   WHERE tr.TIMESTAMP > SYSDATE - 75 / 1440
                   AND tr.TIMESTAMP <= SYSDATE - 15 / 1440
    GROUP BY starts_with;
    `  
    exit;  
    EOF
    

    然后使用grepwc 命令将您的条件应用于sql.out,并使用mailx(如果已安装)或sendmail 发送电子邮件:

    if grep -q something sql.out
    then
        # send email containing the output of the SQL statement
        cat sql.out | mailx -s "UP ALERT" xyz@mail.com
    fi
    
    #delete sql.out
    rm sql.out
    

    【讨论】:

    • 我正在尝试以下操作,但一旦发送电子邮件,它就会退出循环:#! /bin/bash cat sql.out | while read next do i=echo $next | awk -F"|" '{print($1)}'` j=echo $next | awk -F"|" '{print($2)}' k=echo $next | awk -F"|" '{print($3)}' if [ "$k" == 0 ] then mail -s "$i's $j is DOWN, please take necessary action" xyz@mail. com else mail -s "一切都很好" xyz@mail.com fi done`。因此,如果该值不为 0,它会发送一条消息“一切都很好
    • 在第 1 行,没有进一步的操作。在第 4 行中,我们确实将零值设为 $k,因此它还应该发送一封电子邮件,其中包含“$i 的 $j 已关闭,请采取必要的措施”。它确实会读取每一行,但是一旦发送电子邮件,它就会跳出循环或 IF 语句,为什么?
    【解决方案2】:

    1) 要每小时运行一个命令,只需编辑您的用户 crontab 并添加:
    0 * * * * command

    2) 这可以通过多种方式完成。 UNIX 邮件服务器是否配置好?

    【讨论】:

      【解决方案3】:

      查看 crond 和 sendmail 的联机帮助页。

      【讨论】:

        【解决方案4】:

        对于 (1),请查看 cron(1) 的手册页。这会做你想做的。

        对于 (2),您需要从 Oracle 内部发出电子邮件(请参阅 DBMS_MAIL 包)或将 SQLPlus 的输出重定向到文件并在 shell 脚本中处理该文件。有关如何执行此操作的详细信息,请参阅 mail(1) 命令的文档。

        【讨论】:

          猜你喜欢
          • 2016-05-05
          • 2010-12-19
          • 2013-08-17
          • 1970-01-01
          • 2016-11-03
          • 2011-09-16
          • 2011-04-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多