Linux | 定时任务:crontab实践 执行定时任务、发送执行结果或文件至邮箱

目录:

  • 0,现状:定时单次执行一个脚本任务
  • 1,需求:定时执行多次该脚本任务
  • 2,实现:最佳实践,少走弯路
  • 3,其他:邮件消息通知,或发送文件至邮箱

0,现状

示例:有个脚本(如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)

1,需求

将上述参数(日期)从2022-01-01 到 2022-04-01(左闭右开,不包括2022-04-01) 期间连续的每个日期都执行一次脚本test.sh。即 1月到 3月份的数据
这里为什么一次只执行一天的任务??? 因为 1天的数据量已经是不少了。如果一次性集中处理大量数据(几个月的),会导致任务不能执行、…崩溃。

所以,分散处理、减少单次计算的数据量。

2,实现:最佳实践,少走弯路

基于 不改变test.sh脚本内容,因为它还需 用于有时单独、临时执行一下任务。
Linux | 定时任务:crontab实践 执行定时任务、发送执行结果或文件至邮箱_第1张图片

第一步: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内容是不行的。

3,其他:邮件通知

用于通知你:定时任务的执行情况!

若公司网络、服务器等各种加密和安全措施,可能需要采取其他手段来发邮件 或其他形式的通知。

首先,如果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 参数 表示邮件标题

Linux | 定时任务:crontab实践 执行定时任务、发送执行结果或文件至邮箱_第2张图片

你可能感兴趣的:(工具,Linux,linux,crontab,定时任务)