linux 定时任务
2020-05-20 本文已影响0人
麟之趾a
任务计划/周期性任务执行
未来的时间点执行一次某任务: at batch
周期性运行某任务: crontab
以上执行结果:会通过邮件发送给用户
邮件服务
本地电子邮件服务
smtp:简单邮件传输协议
pop3:邮局协议
imap4: 互联网邮件访问协议
mail命令
mail 命令
mailx: 收发互联网邮件
MUA: 用户收发邮件工具。我们平时用的web,也一种MUA
mail/mailx [-S 'SUBJECT'] username[@hostname]
邮件正文生成
1) 交互式输入,以点号单独成行表示正文结束 ctrl+D 提交也可以
2)输入重定向
3)通过管道
任务计划
at
at:未来时间执行一次
at [option]... TIME
option:
-l 查看队列 at -l 或 atq
-f 从指定文件中读取作业任务
[root@db02 ~]# at -f /root/task_file now+1min
job 2 at Tue May 26 07:43:00 2020
您在 /var/spool/mail/root 中有邮件
[root@db02 ~]# cat task_file
echo e
-d 删除任务 at -d 3 删除3号任务
-q queue:指明队列,at 有 a ??? 多个序列
-c 查看作业执行内容 at -c 任务号
TIME:
HH:MM [YYYY-mm-dd]
noon (中午12点) midnight(午夜12点)teatime(下午4点)tomorrow
now+#
#单位:minutes hours days weeks
[root@db02 ~]# at now+1min 1分钟后运行命令
at> ls /root
at> <EOT>
job 1 at Tue May 26 07:40:00 2020
[root@db02 ~]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root Tue May 26 07:40 23/672 "Output from your job 1"
注:at密码有默认执行命令的环境,当我们推出终端,at命令需要执行,所有它有自己的一个环境
注:作业执行结果是邮件发送给提交作业的用户
batch
batch 会让系统自行选择在系统资源空闲时间去执行指定任务
其余内容与at一样
周期性执行任务 cron
服务程序
cronle:主程序包,提供了crond守护进程及相关的辅助工具
我们要时刻保证crond守护进程的运行状态。这个进程会时刻检测我们的任务脚本
像crond提供的作业方式不同于at,它需要使用专有的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件,要使用crontab命令
cron 任务分为两类
系统cron任务:主要用于实现系统自身的维护,手动编辑/etc/crontab
用户cron任务: crontab命令
/var/spool/cron/USERNAME
系统cron的配置格式
[root@db02 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
SHELL:使用哪个shell
PATH:定时任务的路径变量
MALTO:执行结果的邮件发送给哪个用户
1) 每一行定义一个周期性任务共7个字段
2)此处的环境变量,不同于用户登录的环境变量,因此建议使用命令的绝对路径,或者自定义PATH环境变量
3)执行邮件发送给MALTO用户
用户cron
配置文件
/var/spool/cron/USERNAME
1) 每行共有六个字段
2)此处的环境变量,不同于用户登录的环境变量。因此建议使用命令的绝对的路径,或则自定义环境变量
3) 邮件发送给当前用户
# 时间表示法
1) 特定值
给定时间点,有效取值范围内的值。注意日期和周不要同时使用
2)* 表示给定时间点上有效取值范围内所有值,表 "每" 什么之意
3) 离散取值
在给定时间点上,使用逗号分隔的多个值
9 8 * * 3,5
4)连续取值
在时间点上使用- 连接开头和结尾
0 9-18 * * 1-5 每周一到周五的9点到18点的0分执行任务
5)在指定的时间点上定义步长/#
#:#即步长
*/5 * * * * 每五分钟执行一次任务
注意:在指定的时间点,不能被步长整除时,其意义不复存在。
最小时间单位为分钟,想完成秒级任务,需要借助其他机制,定义每分钟任务,而利用脚本循环多次
### crontab 命令
crontab [-u user] [-l | -r | -e| -i]
-u user:root用户可以为指定用户管理cron任务
-e:编辑任务
-l:列出所有任务
-r:移除所有任务,即删除/var/spool/cron/USERNAME文件
-i:在使用-r移除所有任务,提示用户是否删除
注意:执行结果都以邮件发送给当前用户,如果拒绝接收邮件,可使用以下命令
COMMAND > /dev/null 如果命令执行失败,依然接收邮件
COMMAND &> /dev/null
定义COMMAND命令时,如果命令中有用到%,需要对其转义,但放置于单引号中的%不用转义即可
思考:某任务在指定时间因关机未能执行,下次开机会不会自动执行?
答:不会
如果想要其继续执行,则使用anacron实现