定时任务crontab使用及企业案例 定时邮箱发送设置


一、定时任务

## 定时任务,服务启动和停止
# C6:
/etc/init.d/crond start
/etc/init.d/crond stop

# C7
systemctl start crond
systemctl stop crond

1. 定时任务配置文件

FBI WARNING:PATH 出现的目录,下面可执行文件,都可以不加路径直接执行。

[root@qls ~]# vi /etc/crontab 

# 定时任务的shell
SHELL=/bin/bash
# 环境变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# 如果定时任务执行报错,会给root用户发邮件
MAILTO=root

写定时任务的潜规则:

  • 1.所有命令是用绝对路径
  • 2.复杂命令或者多个命令,尽量写到脚本中执行
  • 3.定时任务中,所有的输出内容全部放到/dev/null
  • 4.给定时任务注释

2. 定时任务语法

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed


分        时        日         月        周     
*         *         *         *         *                                ls
0-59     0-23      1-31      1-12       0-6(1-7) 周日:0或7              command


# 每天凌晨两点执行 ls 命令
00 02 * * * /bin/ls

# 每个月的1号凌晨2点执行ls命令
00 12 1 * * /bin/ls

# 每月1号和15号12点都行一次ls命令
00 12 1,15 * * /bin/ls

# 每月1号到15号12点都行一次ls命令
00 12 1-15 * * /bin/ls

# 每年的2月14号的凌晨2点,执行ls命令
00 02 14 2 * /bin/ls

# 每周日的凌晨两点执行ls命令
00 02 * * 7 /bin/ls

# 每年6月份的所有周五凌晨2点执行ls命令
00 02 * 6 5 /bin/ls

# 每个月的14号刚好是周日,那么就在凌晨2点执行ls命令
00 02 14 * 7 /bin/ls

# 哪一年2月14日刚好是周日,那么在凌晨2点执行ls命令
00 02 14 2 7 /bin/ls

# 每天的凌晨2点钟,每十分钟执行一次ls
*/10  02 * * * /bin/ls

# 每分钟执行一次 ls
* * * * *  /bin/ls

# 每分钟执行一次 ls
*/1 * * * *  /bin/ls

# 每年的2月14日00点执行ls命令
00 00 14 2 *  /bin/ls

# 每5分钟执行一次ls命令
*/5 * * * *  /bin/ls

# 每年的1月和5月和8月的每天晚上凌晨2点执行ls命令
00 02 * 1,5,8 * /bin/ls
1月1日,2
1月2日,2
...
1月31日,2
5月1日,2
...
5月31日,2
8月1日,2
...
8月31,2

# 每年的1月到7月和9月到12月的每天凌晨2点执行ls命令
00 02 * 1-7,9-12 * /bin/ls
1月1 - 31日,2
2月1 - 28,2
3月1 - 31日,2
4月1 - 30日,2
5月1 - 31日,2
6月1 - 31日,2
7月1 - 31日,2
9月1 - 31日,2
10月1 - 30日,2
11月1 - 30日,2
12月1 - 31日,2

# 每个月的1号到8号的凌晨2点执行
00 02 1-8 * *  /bin/ls
1月1 - 8日,2
2月1 - 8日,2
3月1 - 8日,2
4月1 - 8日,2
5月1 - 8日,2
6月1 - 8日,2
7月1 - 8日,2
8月1 - 8日,2
9月1 - 8日,2
10月1 - 8日,2
11月1 - 8日,2
12月1 - 8日,2


# 每天晚上21点整,执行ls命令
0 21 * * * /bin/ls

# 每个月的1号和10号和22号的凌晨4点45分执行ls命令
45 4 1,10,22 * * /bin/ls

# 每个月的1号到10的凌晨4点45分执行ls命令
45 4 1-10 * * /bin/ls

# 每个月的每2天的8点到11点的3分和15分执行ls命令
3,15 8-11 */2 * * /bin/ls
保存时间:2020年4月26日 11点35分

4月28号,8点03分 和 8点15分,9点03分 和9点15分 , 10点03分和10点15分,11点03分和11点15分执行ls命令
4月30号
5月1号
5月3号

# 每天的00点-7点的每个小时和23点-00点的每个小时都执行ls命令
0 23-7/1 * * * /bin/ls

# 每周一到周五的晚上21点15分执行ls命令
15 21 * * 1-5 /bin/ls

3. crontab命令

选项 作用
-e edit 编辑定时任务
-l list 查看定时任务
-r remove 删除当前用户的定时任务
-u 指定用户
# 写定时任务的潜规则:
1.所有命令是用绝对路径
2.复杂命令或者多个命令,尽量写到脚本中执行
3.定时任务中,所有的输出内容全部放到/dev/null
4.给定时任务注释

crontab -e
vim /var/spool/cron/$USER

crontab -l

crontab -l -u zls

crontab -r

# 删除指定用户的定时任务
[root@qls ~]# crontab -r -u zls

# 第一个定时任务
crontab -e
# 每五分钟跟阿里云同步一次系统时间 日期:xxx 谁:xxx
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null

4. 定时任务调试

1.在做定时任务之前需要做调试工作
比如日志多少时间收集一次,需要先调试好,在使用。

2.crond编写思路
   1.)手动执行命令,然后保留执行成功的结果。
   2.)编写脚本
脚本需要统一路径/scripts
脚本内容复制执行成功的命令(减少每个环节出错几率)
脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null

3.执行脚本
使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash)
执行脚本成功后,复制该执行的命令,以便写入cron

4.编写计划任务
加上必要的注释信息, 人、时间、任务
设定计划任务执行的周期
粘贴执行脚本的命令(不要手敲)

5.调试计划任务
增加任务频率测试
检查环境变量问题

二、定时任务案例

1. 定时备份

#1.定时备份
#需求:将备份命令写入一个脚本中,每天备份/etc目录,压缩打包放到/backup目录下

# 任务:
#1)每天备份文件名要求格式:日期_主机名_etc.tar.gz
#2)保存路径/backup目录下
#3)存放备份内容的目录要求只保留3天的数据
#4)在执行计划任务时,不要输出任务信息

思路:
1.先在命令行测试,命令是否可用,再写入脚本
2.写脚本,写一句,测一句

#!/bin/bash
D=(date +%F)
H=(hostname)
DIR='/backup'
[ ! -d DIR ] && mkdirDIR
cd / && \
tar zcf DIR/{D}_{H}_etc.tar.gz etc
findDIR ! -mtime -3|xargs rm -f

[root@qls ~]# crontab -e
# 每天晚上23:00定时打包etc目录 xxx xxx
00 23 * * * /bin/sh /root/backup_etc.sh &>/dev/null


#2.在每个月的第一天压缩/etc目录下的所有内容,存放在/root/backup目录里,且文件名为当前系统时间?
00 23 01 * * /bin/sh /root/backup_etc.sh &>/dev/null
*/1 * * * * /bin/sh /root/backup_etc.sh &>/dev/null

#3.每周三01:00~04:00每3分钟执行一次/home/data/demo.sh
*/3 1-4 * * 3 /bin/sh /home/data/demo.sh &>/dev/null


#4.每周一到周六的凌晨3点20分,运行tar命令对/etc/目录进行存档另存,存储位置为/data/bak,文件名为“system_+当前系统时间”
20 03 * * 1-6 /bin/sh /root/bak.sh &>/dev/null

#5.每日凌晨2点30分,运行cp命令对/etc/fstab文件拷贝到/tmp下
30 02 * * * /bin/cp /etc/fstab /tmp &>/dev/null

#6.每月每天凌晨3点30分和中午12点30分执行test.sh脚本
30 3,12 * * * /bin/sh /root/test.sh &>/dev/null
30 3,12 * * * /bin/sh /root/test.sh &>/dev/null


#7.每隔6小时的每30分钟执行test.sh脚本
*/30 */6 * * * /bin/sh /root/test.sh &>/dev/null

#8.早上8点到下午18点每隔2小时的每30分钟执行test.sh脚本
30 8-18/2 * * * /bin/sh /root/test.sh &>/dev/null

#9.晚上21点30分执行test.sh脚本
30 21 * * *  /bin/sh /root/test.sh &>/dev/null

#10.每月1号、10号、22号凌晨4点45分执行test.sh脚本
45 4 1,10,22 * * /bin/sh /root/test.sh &>/dev/null

#11.8月份周一、周日凌晨1点10分执行test.sh脚本
10 1 * 8 1,7 /bin/sh /root/test.sh &>/dev/null
10 1 * 8 7,1 /bin/sh /root/test.sh &>/dev/null
10 1 * 8 7-1 /bin/sh /root/test.sh &>/dev/null
10 1 * 8 0-1 /bin/sh /root/test.sh &>/dev/null
10 1 * 8 1,0 /bin/sh /root/test.sh &>/dev/null
10 1 * 8 0,1 /bin/sh /root/test.sh &>/dev/null


#12.每小时整点执行test.sh脚本
00 */1 * * * /bin/sh /test.sh &>/dev/null

#13.每月的4号与每周一到周三的11点重启vsftpd服务
00 11 4 * * /usr/bin/systemctl restart vsftpd &>/dev/null
00 11 * * 1-3 /usr/bin/systemctl restart vsftpd &>/dev/null

#15.写一条计划任务,在每天晚上的3:05分执行脚本/usr/script/tongji.sh

#16.在每周6的凌晨3:15执行/home/shell/collect.pl,并将标准输出和标准错误输出到/dev/null设备,请写出crontab中的语句

2. 更多使用

# 每6个小时的半点执行一次脚本
30 */6 * * * /bin/sh /scripts/zls.sh

# 早上8点到下午18点每隔2小时的每30分钟执行/scripts/zls.sh
30 8-18/2 * * * /bin/sh /scripts/zls.sh

三、定时邮件任务

1. 设置任务

# 1.配置服务器发邮件(安装发邮件服务)
[root@qls ~]# yum install -y mailx
# 2.修改mail的配置文件
[root@qls ~]# vim /etc/mail.rc
#发件人
set from=253097001@qq.com
#邮件服务器
set smtp=smtp.qq.com
#发件人用户名
set smtp-auth-user=253097001@qq.com
#发件人密码(QQ邮箱不可以使用密码,只能使用授权码)
set smtp-auth-password=xxxx
#登录方式
set smtp-auth=login
#邮件服务器协议及端口
set smtp=smtps://smtp.qq.com:465
#忽略证书
set ssl-verify=ignore
#指定证书位置
set nss-config-dir=/root/.certs

2. 设置邮箱

1.打开qq邮箱,设置-账户

2.下拉至如下图所示,点击生产授权码

3.用手机发送短信

4.将生成的授权码复制到文件中

#手动创建证书目录
===========================
mkdir -p /root/.certs

## 进入证书目录
cd /root/.certs

## 获取腾讯证书
echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,,"  -d  ~/.certs  -i  ~/.certs/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,,"  -d  ~/.certs  -i  ~/.certs/qq.crt
certutil -L -d /root/.certs
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs -i ~/.certs/qq.crt


情书脚本

#!/bin/bash
lb_dir='/root/qingshu'
lb_name=`ls -1 lb_dir|head -1`
catlb_dir/lb_name | mail -s '致亲爱的小姐姐' 133411023qq.com
mvlb_dir/$lb_name /tmp


vim /root/qingshu/aaaa
vim /root/qingshu/aaa
vim /root/qingshu/aa
vim /root/qingshu/a
vim /root/qingshu/bbb
vim /root/qingshu/accc

crontab -e
# 每天5:20发情书给小姐姐
* * * * * /bin/sh /root/send_lovebook.sh &>/dev/null

3. 带附件邮件mutt

# linux shell发送带附件的邮件
如果没有正文文件的话,就用echo直接把正文打出来就行了,如:
echo "this is content" | mutt -s "this is subject" -a /path/yourfile abc@local.domain -c bbb@local.domain

# 如果有正文文件的话就用:
cat /path/contentfile  | mutt -s "this is subject" -a /path/yourfile abc@local.domain -c bbb@local.domain

======================================
# mutt命令,linux下一个强大的邮件客户端软件:
-s是主题
-a是附件
-c是抄送
1.多个抄送就是多个-c,如:
cat /path/contentfile  | mutt -s "this is subject" -a /path/yourfile abc@local.domain -c bbb@local.domain -c ccc@local.domain -c ddd@local.domain

2.如果发送多个email,就直接列出来就行了,如:
cat /path/contentfile  | mutt -s "this is subject" -a /path/yourfile abc@local.domain  bbb@local.domain ccc@local.domain ddd@local.domain

4. mail命令用法

1.) 普通邮件

# mail命令
1.语法
mail -s “主题”用户名@地址< 文件
2.读取邮件
mail -e
mail -f [ -dHNn ] [ -F ] [ FileName ]
mail [ -dHNn ] [ -F ] [ -u UserID ]
3.发送邮件
mail [ -s Subject ] [ -c Address(es) ] [ -dinNv ] Address
================================
mail -s test admin@aispider.com
mail -s “program” user < file.c 
将file.c当做mail的内容,送至user,主题为program。

# 四种常用格式发信:
1.你可以把当前shell当成编辑器来用,编辑完内容后Ctrl-D结束,连按两次Ctrl+C键则中断工作,不送此信件。
mail -s test admin@aispider.com 

2.可能是喜欢管道的缘故吧
echo “mail content”|mail -s test admin@aispider.com 

3.以file的内容为邮件内容发信
mail -s test  admin@aispider.com < file 

4.给多个用户发送邮件
mail -s test -c admin@aispider.com  root@aispider.com< file 

5.检查所传送的电子邮件是否送出,或是滞留在邮件服务器中
语法:/usr/lib/sendmail -bp
若屏幕显示为“Mail queue is empty” 的信息,表示mail 已送出。
若为其他错误信息,表示电子邮件因故尚未送出。

2.) 附件邮件

# 带附件的邮件
1. 如果你的系统里没有uuencode命令的话,请先安装sharutils(yum install  -y sharutils)

2. uuencode 需要两个参数:
第一个是你要发送的文件(们),当然这个也可以用管道来做,
第二个是显示的文件名.
uuencode /home/yfang/a.gif a.gif|mail -s pictest admin@aispider.com
tar czf - /home/yfang/ | uuencode home.tgz |mail -s pictest admin@aispider.com

ps: 顺便补一句,slackware下的mail好像有一个-a参数,可以直接添加附件,我没有用过。

3.) 阅读邮件

Linux下Mail命令收集系统收到邮件都会保存在“/var/spool/mail/[linux用户名]”文件中。
在linux中输入mail,就进行了收件箱,并显示二十封邮件列表。

& help //如果不会使用或者忘记了什么命令,就输入 help 或者 ? 来获取帮助
        Mail   Commands
    t <message list>                打印出信息 【注意】多个信息用空格分开,如 t 1 7
    n                                    打印出下一条信息
    e <message list>                编辑信息
    f <message list>                输出信息的头行
    d <message list>                删除信息
    s <message list> file           追加信息到文件file
    u <message list>                不删除某信息
    R <message list>                回复发件人
    r <message list>                回复发件人和本信息所有的收件人
    pre <message list>              保留信息在 /usr/spool/mail  1*
    m <user list>                   发邮件,多个收件人用空格分开【需要sendmail支持】
    q                               quit, saving unresolved messages in mbox 2*
    x                               quit, do not remove system mailbox
    h                               print out active message headers
    !                               让shell执行某命令,如 !ls 输出ls命令结果
    cd [directory]                  改变目录,这里不用 !cd,但打印当前目录需要 !pwd
    A <message list> consists of integers, ranges of same, or user names separated
    by spaces.  If omitted, Mail uses the last message typed.
    A <user list> consists of user names or aliases separated by spaces.
    Aliases are defined in .mailrc in your home directory.

    1* 如果阅读过某信息,执行q退出时候,mail会把阅读过的信息“取回”放在 ~/mbox,执行pre后就不取回。如果退出时执行x命令则不会取回信息。
    2* 这三句不难理解,但不好翻译(本人水平问题),也就保留原文了

    所支持的全部命令列表:
    & l
    Commands are:
    next, alias, print, type, Type, Print, visual, top, touch, preserve,
    delete, dp, dt, undelete, unset, mail, mbox, more, page, More, Page,
    unread, U, !, copy, chdir, cd, save, source, set, shell, version,
    group, write, from, file, folder, folders, ?, z, headers, help, =,
    Reply, Respond, reply, respond, edit, echo, quit, list, xit, exit,
    size, hold, if, else, endif, alternates, ignore, discard, retain,
    saveignore, savediscard, saveretain, core, #, clobber

    & t 7        //阅读第7封信息,阅读时,按空格键就是翻页,按回车键就是下移一行
    & d 10     //删除第10封信息
    & d 10-100 //删除第10-100封信息
    & top      //显示当前指针所在的邮件的邮件头
    & file       //显示系统邮件所在的文件,以及邮件总数等信息
    & x          //退出mail命令平台,并不保存之前的操作,比如删除邮件
    & q         //退出mail命令平台,保存之前的操作,比如删除已用d删除的邮件,
                   //已阅读邮件会转存到当前用户家目录下的mbox文件中
                   //如果在mbox中删除文件才会彻底删除。
--------------------------------------
Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » 定时任务crontab使用及企业案例 定时邮箱发送设置

提供最优质的资源集合

立即查看 了解详情