Linux基础篇学习——Linux定时计划任务

概念

定时(计划)任务 未来的某时间点执行一次某任务或者周期性的运行某个任务,执行结果会通过邮件的形式发送给用户
定时任务是非登录式shell

分类

(1) 周期性的运行任务 crontab
(2) 定点执行一次某任务 at,batch

系统用户及定时任务

系统任务调度

系统周期性执行的工作 比如写缓存数据到硬盘、日志清理等

crond系统服务

Linux 系统上面原本就有非常多的计划性工作,由默认启动的系统服务 crond 控制,crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,即crond进程定期(每分钟)检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

【查看crond服务状态】
service crond status(CentOS6)
systemctl status crond(CentOS7)

配置文件

系统任务调度配置文件 /etc/crontab /etc/cron.d/

[root@zycentos7 ~]# cat /etc/crontab
SHELL=/bin/bash	;系统要使用的shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin	;系统执行命令的路径
MAILTO=root	crond的任务执行信息接收人(变量的值为空,表示不发送)
HOME=/	;在执行命令或者脚本时使用的主目录

# 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
注意事项

(1) 每一行定义一个周期性任务,共7个字段 * * * * * user-name command to be executed

内容含义
* * * * *定义周期性时间
user-name运行任务的用户身份
command to be executed任务

(2) 命令使用绝对路径或者自定义PATH环境变量 此处的环境变量不同于用户登录后获得的环境
(3) 执行结果邮件发送给MAILTO指定的用户

使用者权限文件

文件含义
/etc/cron.deny该文件中所列用户不允许使用crontab命令
/etc/cron.allow该文件中所列用户允许使用crontab命令
/var/spool/cron/所有用户crontab文件存放的目录,以用户名命名

时间表示法

(1) 特定值
给定时间点有效取值范围内的值 day of week和day of month一般不同时使用
(2) *
给定时间点有效取值范围内的值 每……
(3) 离散取值,
在时间点上使用逗号分隔的多个值 #,#,#
(4) 连续取值-
在时间点上使用-连接开头和结束 #-#
(5) 在指定时间点上,定义步长 /#

注意:
(1) 指定的时间点不能被步长整除时,其意义将不复存在
(2) 最小时间单位为“分钟”,想完成“秒”级任务,得需要额外借助于其它机制:定义成每分钟任务,而在利用脚本实现在每分钟之内,循环执行多次

用户任务调度

用户定期要执行的工作 比如用户数据备份、定时邮件提醒等
(1) 用户设置的计划任务由 crontab 命令控制
(2) 用户定义的crontab文件都被保存在 /var/spool/cron 目录中,以用户名为文件名

注意:
(1) 格式与系统任务调度配置文件相同
(2) 每行定义一个cron任务,共6个字段
(3) 命令使用绝对路径或者自定义PATH环境变量 此处的环境变量不同于用户登录后获得的环境
(4) 邮件发送给当前用户

crontab 计划任务

crontab是用来定期执行程序的命令

crontab -e 编辑计划任务
crontab -l 查看计划任务
crontab -r 移除所有任务 即删除 /var/spool/cron/USERNAME 文件
crontab -ri 移除时交互
crontab -u user root用户可为指定用户管理cron任务
在这里插入图片描述注意事项:
(1) 注释
(2) 用绝对路径
(3) 信息重定向 /dev/null 2>&1
(4) COMMAND中的%需要转义,但放置于单引号中的%不用转义

练习

(1) 每1分钟执行一次 * * * * * command
(2) 每隔两天的上午8点到11点的第3和第15分钟执行 3,15 8-11 */2 * *
(3) 每个星期一的上午8点到11点的第3和第15分钟执行 3,15 8-11 * * 1
(4) 每晚的21:30重启smb 30 21 * * *
(5) 每天18 : 00至23 : 00之间每隔30分钟重启smb */30 18-23 * * *
(6) 每星期六的晚上11 : 00 pm重启smb 0 23 * * 6
(7) 每一小时重启smb 0 */1 * * *
(8) 晚上11点到早上7点之间,每隔一小时重启smb 0 23-7/1 * * *
(9) 每月的4号与每周一到周三的11点重启smb 0 11 4 * 1-3
(10) 备份etc目录

[root@zycentos7 ~]# crontab -e
SHELL=/bin/bash    #指定shell类型
PATH=/sbin:/bin:/usr/sbin:/usr/bin  #指定环境变量
MAILTO=root    #指定运行用户
#备份etc目录                 #注释
1,2 * * * * /bin/tar -zvcf /data/etc.`date "+\%Y\%m\%d\%H\%M"`.tar.gz /etc/ >/dev/null 2>&1

(1) 每隔和每意义相同
(2) 在分上若没有指定具体的分钟会就默认每分钟执行一次
(3) */1等于*
(4) 重启smb /etc/init.d/smb restart
(5) 实时查看日志信息 tail -f /var/log/cron

思考题

某任务在指定的时间因关机未能执行,下次开机会不会自动执行?不会
如果任务某时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用 anacron 实现

设置crontab服务开机自启动

[root@localhost ~]# systemctl enable crond
[root@localhost ~]# chkconfig crond on
Note: Forwarding request to 'systemctl enable crond.service'.
[root@zycentos7 ~]# systemctl status crond	;查看crontab服务状态

at 定点任务

OPTION

at 在特定的时间执行一次性的任务
atq 或 at -l 列出用户的计划任务
atrm 或 at -d 根据Jobnumber删除at任务
batch 在系统负荷允许的情况下执行at任务,换言之,就是在系统空闲的情况下才执行at任务

[root@zycentos7 ~]# yum -y install at
[root@zycentos7 ~]# at
Garbled time
[root@zycentos7 ~]# systemctl start atd	;启动服务

示例1 5分钟后执行

[root@zycentos7 ~]# at now +5 minutes
at> echo "5 minnutes" > a.txt
at> <EOT>	;Ctrl+d
job 5 at Mon Nov 11 21:05:00 2019

示例2 8分钟后执行

[root@zycentos7 ~]# at now +8 minutes
at> echo "8 minutes" > b.txt
at> <EOT>
job 6 at Mon Nov 11 21:09:00 2019

示例3 查看待处理作业

[root@zycentos7 ~]# atq
1       Mon Nov 11 21:05:00 2019 a root
2       Mon Nov 11 21:09:00 2019 a root

root用户将列出所有用户的任务,结果的输出格式为:作业号、日期、小时、队列和用户名
示例4 根据作业ID查看作业内容

[root@zycentos7 ~]# at -c 5
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
HOSTNAME=zycentos7; export HOSTNAME
……
echo "5 minnutes" > a.txt

marcinDELIMITER469a164c

示例5 删除待处理作业

[root@zycentos7 ~]# atrm 1
[root@zycentos7 ~]# atq
2       Mon Nov 11 21:09:00 2019 a root

习题

使用进程调度启动,指定30分钟后(或在2008年12月28日晚上20点30分)将/home/stu目录里的文件备份并压缩为stu.tar.gz,并放到/home/temp目录里(当前/home/temp目录并不存在)。

[root@nfs01 ~]# at now + 30 minutes
at> mkdir /home/temp
at> tar -zcf /home/temp/stu.tar.gz /home/stu/*
at> <EOT>
job 4 at Sat Feb 22 19:41:00 2020

在这里插入图片描述

linux系统bash加载环境变量的过程

在这里插入图片描述

登录式shell

/etc/profile -->/etc/profile.d --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登录式shell

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

定时任务是非登录式Shell,其读取的配置文件为 ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh,加载环境变量的顺序略过了/etc/profile,因此导致环境变量不完整,可能导致脚本执行失败

解决方法

  1. 可以在脚本中加上环境变量的路径
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/data/nginx/sbin:/root/bin
  1. 可以在计划任务中将非登录shell未加载的/etc/profile文件加载
#backup data
0 0 * * * root ./etc/profile;/usr/bin/fileback tar >/dev/null 2>&1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值