【Linux】Linux定时任务

at 一次性定时任务

1
2
3
4
5
chkconfig --list |grep atd
#确定at安装
service atd restart
#启动at服务

访问控制

  • 如果系统中有/etc/at.allow文件(白名单),那么只有在此文件的用户可以使用at命令(/etc/at.deny文件会被忽略);
  • 如果系统中没有/etc/at.allow文件,只有/etc/at.deny文件(黑名单),那么在此名单下的用户不能使用at命令【对root不起作用】
  • 如果系统这两个文件都不存在,那么只有root用户可以使用at命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
at [选项] 时间
选项:
-m :执行工作后通知执行at命令的用户
-c :显示该at工作的实际内容
时间:
HH:MM
HH:MM YYYY-MM-DD
HH:MM[am|pm] [month][date]
HH:MM +[minutes|hours|days|weeks]
at now + 5 minutes
>>at /root/test.sh
五分钟后执行/root/test.sh脚本,必须写绝对路径
用ctrl+删除键删除,按ctrl + d 保存退出at
atq
#查询当前服务器上的at工作
atrm [工作号]
#删除指定的at任务


用户 crontab 循环定时任务

访问控制

  • 当系统中有/etc/cron.allow文件(白名单),只有写入此文件的用户可以使用crontab命令,没有写入的用户不能使用crontab命令。同样如果有此文件,/etc/cron.deny文件会被忽略,/etc/cron.allow文件的优先级更高;
  • 如果系统中没有/etc/cron.allow文件,只有/etc/cron.deny文件(黑名单),那么在此名单下的用户不能使用cron命令【对root不起作用】
  • 如果系统这两个文件都不存在,那么只有root用户可以使用cron命令

被周期性执行的任务称为Cron Job
周期性执行的任务列表称为Cron Table

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
crontab -l
#查询是否安装
systemctl status crond
#检查是否启动
yum install crontabs
systemctl start crond
#启动
systemctl enable crond
#开机自启
crontab [选项]
选项:
-e #进入crontab编辑界面,当前用户vim方式编辑
-l #查看当前用户的crontab任务
-r #删除当前用户所有的定时的任务
-u #指定用户
* * * * * 执行的任务
#crontab -e 输入格式
#第一个 * 一小时的第几分钟 0-59
#第二个 * 一天当中的第几小时 0-23
#第三个 * 一月当中第几天 1-31
#第四个 * 一年当中第几个月 1-12
#第五个 * 一周中的第几天 0-7(0和7都代表星期日)
特殊符号 含义
* 代表任何时间,如第一个* 代表每分钟执行一次
代表不连续的时间,如:0 8,12,16 *代表每天的8点0分/12点0分/16点0分执行
- 代表连续时间, “0 5 * 1-6”代表每周一到周六5点执行
*/n 代表每个多久执行一次,”/10 *”表示每10钟执行一次

注意

  • 星期几与几号最好不要连用,因为都以天作为单位,容易让管理员混乱
  • 六个选项都不能为空,必须填写。如果不确定使用*代表任意时间
  • 最小有效时间为分钟,最大有效时间为月,像2018年某时执行,3点30分30秒这样的时间都不能使用
  • 定时任务中的命令最好使用绝对路径,定时任务有自己的PATH路径(/etc/crontab)

时间 含义
* 5 * * 1 /root/hello.sh 每周一的5点的每分钟执行一次
*/1 * * * * date >> /tmp/log.txt 每分钟打印当前时间到日志文件中
*/2 * * * *
1-59/2 * * * *
每隔两分钟
* 2 * * * 2点的每分钟
0 23-7/1 * * * * 晚上23点到早上7点,每隔一个小时
0,30 * * * *
0-59/30 * * * *
每隔30分钟
59 1 1-7 4 * test date +\%w -eq 0 && /root/a.sh 四月的第一个星期日早晨1时59分运行a.sh

每半分钟执行一次

1
2
*/1 * * * * date >> /tmp/date.log
*/1 * * * * sleep 30s;date >> /tmp/date.log


系统 crontab 循环定时任务

contab -e是每个用户执行的命令,也就是说不同的用户身份可以执行自己的定时任务,可是有些定时任务需要系统执行,这里我们就需要编辑/etc/crontab这个配置文件了

/etc/crontab的功能逐渐被anacron取代
/etc/cron.{hourly,daily,weekly,monthly}不再依赖/etc/crontab而是anacron
主要说明CentOS

执行系统任务的方法

  • 手工执行定时任务:crontab -e
  • 系统定时任务
    • 将定时任务脚本复制到/etc/cron.{hourly,daily,weekly,monthly}目录中,就能自动定时执行(推荐)
    • 修改crontab配置文件

crontab相关文件

  • /etc/crontab #系统配置文件,只有root用户才会把这些内容载入到计任务表中
  • /var/spool/cron #最终生成的计划任务文件
  • /var/spool/cron/root #root用户的定时任务
  • /var/spool/cron/user1 #user1用户的定时任务
  • /var/log/cron #crontab日志,保存cron的任务执行记录,echo会打印到这里
  • /var/log/cron-日期


anacron配置

anacron 是用来保证在系统关机的时候错过的定时任务,可以在系统开机之后再执行

检测周期

  • anacron会使用一天、七天、一个月作为检测周期
  • 在系统的/var/spool/anacron目录中存在cron.{daily.weekly,monthly}文件,用于记录上次执行cron的时间
  • 和当前时间做比较,如果两个时间的差值超过了anacron的指定时间差,证明有cron任务被漏执行

在老的CentOS版本中,/etc/cron.{daily.weekly,monthly}这些目录即会被cron调用,也会被anacron调用,容易重复执行
在CentOS 6.x中则只会被anacron调用,避免了重复执行
在CentOS 6.x中,anacron不再是服务,而是系统命令

配置文件目录

/etc/anacrontab

方法

只需要将需要定时执行的任务脚本放到 /etc/cron.(daily,weekly,monthly) 目录下,就能自动定时执行

特点

方便,易管理,一定程度上防止意外情况,执行时间不确定