目录:
示例:有个脚本(如shell 或perl 等写的),单次执行:sh test.sh 2022-04-17
#!/bin/bash
#系统当前日期时间
cur_dateTime="`date +'%Y-%m-%d %H:%M:%S'`"
echo -e " $cur_dateTime 执行sh脚本中... hello world $1\n" >>./log_cyg.txt
1),
echo
在linux用于输出一些提示信息。-e
开启转义,解决写入文件时,\n
不换行
2),shell脚本中, 反撇号(命令替换,提取命令执行后的输出结果)不能省略,也可使用$()替换, 可以理解为 两个反撇号之间的内容看做一个整体。
这个脚本A上述作用是:写入文件,带有1个参数。这里仅作示例。工作中,脚本可以是任何你想定时跑的任务,比如 查询历史某一天的数据(如做一些ETL处理)插入某表中(ODS层->
DW层)。每天凌晨执行它:
crontab -e
1 0 * * * cd /home/脚本所在目录/ && ./test.sh 2022-04-18
&&
表示前一条命令执行成功时,才执行后一条命令,如:echo '1' && echo '2'
--时间格式说明:
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
将上述参数(日期)从2022-01-01 到 2022-04-01
(左闭右开,不包括2022-04-01
) 期间连续的每个日期都执行一次脚本test.sh
。即 1月到 3月份的数据
这里为什么一次只执行一天的任务??? 因为 1天的数据量已经是不少了。如果一次性集中处理大量数据(几个月的),会导致任务不能执行、…崩溃。
所以,分散处理、减少单次计算的数据量。
基于 不改变test.sh
脚本内容,因为它还需 用于有时单独、临时执行一下任务。
第一步:test2.sh
实现执行完开始日期后,继续执行下一天,直至结束日期。
#!/usr/bin/bash
script_name=$1
start_date=$2
end_date=$3
while [[ $start_date < $end_date ]];
do
cur_dateTime="`date +'%Y-%m-%d %H:%M:%S'`"
echo -e "$cur_dateTime----- $1 $start_date 执行开始!" >>./log.txt
sh "$script_name".sh "$start_date"
cur_dateTime="`date +'%Y-%m-%d %H:%M:%S'`"
echo -e "$cur_dateTime----- $1 $start_date ...完毕!\n" >>./log.txt
start_date=`date -d "+1 day $start_date" +%Y-%m-%d`
done
>>./log.txt
表示将一些执行日志 存入文件中,以便查看
第二步:test3.sh
方便用于crontab定时任务
#!/bin/bash
sh /home/脚本所在目录/test2.sh test 2022-01-01 2022-04-01
第三步:编写crontab定时任务,就可以定时执行了!
crontab -e
0 0 * * * cd /home/脚本所在目录/ && ./test3.sh
PS:对于正在执行中的定时任务,想中途停止它的方法
1)找到该任务进程:ps aux | grep xx.sh
第2列即进程ID
2)kill -9 进程号
若该任务还调用了子脚本,也得kill子脚本进程,才能彻底停止定时任务。
修改/删掉crontab -e内容是不行的。
用于通知你:定时任务的执行情况!
若公司网络、服务器等各种加密和安全措施,可能需要采取其他手段来发邮件 或其他形式的通知。
首先,如果linux没有mail(输入mai
按Tab键,看是否会自动出来l
。不会则表明系统没有mail),得先安装:
yum install mailx -y
其次,配置:mail.rc
文件末尾增加如下内容。以QQ邮箱为例
vim /etc/mail.rc
set from=123*****@qq.com 发件人邮箱地址
set smtp=smtp.qq.com
set smtp-auth-user=123***** 发件人邮箱账号
set smtp-auth-password=qvedf*******bdhh 邮箱授权码
set smtp-auth=login
最后,发送:
#发送一个消息
echo "crontab over" | mail -s "title" 收件人邮箱地址
#发送一个文件
mail -s "this is test mail" 收件人邮箱地址 < /tmp/abc.txt
-s
参数 表示邮件标题