任务: 每天早上8:00将oracle查询语句的内容变成html的形式,制作一脚本,在指定时间用mutt自动发送到邮箱版本: Linux version任务: 每天早上8:00将Oracle查询语句的内容变成html的形式,制作一脚本,在指定时间用mutt自动发送到邮箱版本: Linux version 2.6.18-194.el5 Oracle Release 10.2.0.5.0使用工具:shell 脚本mutt 邮件代理sendmail crontab 自动任务处理一 shell脚本(生成html文件,mutt发送)
1 生成html文件利用行列转换的sql语句,,将sys用户下的tb表(表-1)形式转化为表-2,并生成html1.html文件表-1 NAME COURSE SCORE---------- ---------- ----------chen chinese 74 chen math 99 chen physics 88 ck chinese 78 ck math 89 ck physics 98表-2 NAME chinese math physics totle avg---------- ---------- ---------- ---------- ---------- ----------chen 74 99 88 261 87 ck 78 89 98 265 88.33使用的select语句(行列转换)
select name,sum(decode(course,'chinese',score,0)) "chinese",sum(decode(course,'math',score,0)) "math",sum(decode(course,'physics',score,0)) "physics",sum(score) "totle",round(avg(score),2) "avg" from tb group by name;生成html文件#设置生成表格式set pagesize 0 set term off set feedback off set linesize 1000 set trimspool on set term off verify off feedback off pagesize 999#开启生成html文件set markup html on entmap on spool on head "Grade of Students body {backgroud:ffffc6}"set echo off spool /home/oracle/html1.html replace select name,sum(decode(course,'chinese',score,0)) "chinese",sum(decode(course,'math',score,0)) "math",sum(decode(course,'physics',score,0)) "physics",su m(score) totle,round(avg(score),2) avg from tb group by name;spool off set markup html off set echo on 2 使用mutt发送echo cklovely@vip.qq.com > /tmp/user.txt --需要发送的邮件echo “test”|mutt -s “subject name” -a /home/oracle/html1.html `cat /tmp/user.txt`说明:-s 邮件的题目 -a 添加附件 最后是添加发送的邮箱地址注意:此处默认发件箱是本机 root@localhost.localdomain,而值得一提的是,必须要在sendmail运行的行况下才可以发送a 关于sendmail启动缓慢的问题这是个比较常见的问题,出现这个问题的根本原因是主机名没有分配好
解决办法:
我们可以修改系统配置文件/etc/hosts 和/etc/resolv.conf让sendmial绕过查询远程主机,这里给出一种最简单的方法,给主机设置一个别名修改/etc/hosts ,未修改之前127.0.0.1 localhost.localdomain localhost修改成127.0.0.1 localhost.localdomain localhost cklovely b 如果不需要从 root@localhost.localdomain 中发送邮件,可以选择从哪个邮箱发送,在/etc/Muttrc中添加一行oracle知识库oracle知识库下载下载my_hdr from: ckQyanqi@126.com 3 完成html.sh脚本cat /home/oracle/html.sh#!/bin/bash source ~oracle/.bash_profile$ORACLE_HOME/bin/sqlplus -s "/ as sysdba"set pagesize 0 set term off set feedback off set linesize 1000 set trimspool on set term off verify off feedback off pagesize 999 set markup html on entmap on spool on head "Grade of Students body {backgroud:ffffc6}"set echo off spool /home/oracle/html1.html replace select name,sum(decode(course,'chinese',score,0)) "chinese",sum(decode(course,'math',score,0)) "math",sum(decode(course,'physics',score,0)) "physics",sum(score) totle,round(avg(score),2) avg from tb group by name;spool off set markup html off set echo on E echo cklovely@vip.qq.com > /tmp/user.txt echo "test"|mutt -s "Grade of Students" -a /home/oracle/html1.html `cat /tmp/user.txt`二 系统自动按时发送定义时间让系统自动运行脚本的方法很多而在linux系统中经常使用的要数crontab了。
(其他的方法有:oracle中的dbms_jobs,还有就是dbms_scheduler)/etc/cron.deny:將不可以使用 crontab 的帳號寫入其中,若未記錄到這個檔案當中的使用者,就可以使用 crontab 。
运行crontab有2种方法:1 直接用crontab命令當使用者使用 crontab 這個指令來建立工作排程之後,該項工作就會被紀錄到 /var/spool/cron/ 裡面去了,而且是以帳號來作為判別的。另外, cron 執行的每一項工作都會被紀錄到 /var/log/cron 這個登錄檔中,所以囉,如果你的 Linux 不知道有否被植入木馬時,也可以搜尋一下 /var/log/cron 這個登錄檔呢!
Crontab语法:
crontab [-u username] [-l|-e|-r]croutab -e (默认username为root)打开/var/spool/cron/root 编辑croutab -l (默认 username 为root)查看root用户下的自动任务croutab -r (默认 username 为root)删除root下所有的自动任务
编辑内容:
* * * * * command代表意義分鐘小時日期月份週指令數字範圍0-59 0-23 1-31 1-12 0-7命令或脚本特殊字符代表意義*(星號)代表任何時刻都接受的意思!舉例來說,範例一內那個日、月、週都是 * , 就代表著『不論何月、何日的禮拜幾的 12:00 都執行後續指令』的意思!
,(逗號)代表分隔時段的意思。舉例來說,如果要下達的工作是 3:00 與 6:00 時,就會是:0 3,6 * * * command時間參數還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用!
-(減號)代表一段時間範圍內,舉例來說, 8 點到 12 點之間的每小時的 20 分都進行一項工作:20 8-12 * * * command仔細看到第二欄變成 8-12 喔!代表 8,9,10,11,12 都適用的意思!
