1.at计划任务
at计划任务,只在某个指定的事件执行一次的任务。
1)在某一天执行一个脚本
[root@centos7 xx]# at 2020-3-25 at> /bin/aa.sh at> <EOT> job 2 at Wed Mar 25 15:31:00 2020
我们这里的时间只精确到了天,则任务执行的具体时间是提交任务的时间点(指定的那天)。例如这个例子,任务执行的时间点在2020-3-25的15:31:00。
注意,提交计划任务,使用 Ctrl+D 。
2)指定具体执行时间
[root@centos7 xx]# at 10:00 2020-3-25 at> /bin/aa.sh at> <EOT> job 3 at Wed Mar 25 10:00:00 2020
注意,具体时间只能精确到分(不能精确到秒),时间是采用的24小时制。
3)一段时间之后执行
[root@centos7 xx]# at 4:00 + 1weeks at> /bin/aa.sh at> <EOT> job 4 at Mon Mar 30 04:00:00 2020
一周后的那天的早上4点执行。时间单位有:minutes, hours, days, weeks。如果在某段时间后的此时执行,可以使用 at now + 3days 。
4)查看已存在的计划任务
[root@centos7 xx]# atq 2 Wed Mar 25 15:31:00 2020 a root 3 Wed Mar 25 10:00:00 2020 a root 4 Mon Mar 30 04:00:00 2020 a root 6 Thu Mar 26 15:38:00 2020 a root [root@centos7 xx]# at -l 2 Wed Mar 25 15:31:00 2020 a root 3 Wed Mar 25 10:00:00 2020 a root 4 Mon Mar 30 04:00:00 2020 a root 6 Thu Mar 26 15:38:00 2020 a root
5)如何查看at计划任务具体执行的内容
cd /var/spool/at
[root@centos7 at]# ls a0000201931e03 a0000301931cb8 a0000401933770 a00006019323aa spool
可以看到,所有计划任务对应的文件,第5位的数字对应计划任务的编号。我们可以打开文件:
[root@centos7 at]# cat a0000201931e03 #!/bin/sh # atrun uid=0 gid=0 ... ... ${SHELL:-/bin/sh} << 'marcinDELIMITER59a4f86f' /bin/aa.sh
在最后,我们可以看到我们执行的脚本是 /bin/aa.sh 。
6)删除at计划任务
[root@centos7 at]# atrm 2 [root@centos7 at]# at -d 3
使用atrm或at -d加上任务编号就可以删除。
删除1-6号任务:
atrm {1..6}
7)计划任务的权限
如果我们不想让某个用户拥有做计划任务的权限,可以编辑 /etc/at.deny :
leo
kale
将需要拒绝的用户名写到文件中,一行一个用户名。
如果想让leo用户恢复权限,可以从at.deny中删除leo,或者创建一个叫at.allow的文件,将leo写进去。at.allow的优先级高于at.deny。
2.crontab计划任务
Crontab计划任务是周期性运行的计划任务。
1)查询已存在的crontab任务
crontab -l # 查询当前用户的任务
crontab -l -u leo # 查询leo用户的任务
2)编辑crontab任务
crontab -e # 编辑当前用户的任务
crontab -e -u leo # 编辑leo用户的任务
使用crontab -e会自动打开一个文件,该文件存在于 /var/spool/cron 目录下,名字为对应的用户名。例如, /var/spool/cron/root 。
3)crontab内容格式
# 格式如下 # 分 时 日 月 周 命令 0 7 * * * /bin/aa.sh # 每天早上7点0分运行一次 0 7 * * 1,2,3,4,5 /bin/aa.sh # 每周1到5的早上7点0分运行一次 0 7 * * 1-5 /bin/aa.sh # 同上 0 7 * * 1-5/1 /bin/aa.sh # 同上,1为步长 0,5,10,30 7 * * * /bin/aa.sh # 每天早上7:00,7:05,7:10,7:30各运行一次 0-10/5,30 7 * * * /bin/aa.sh # 同上 0 7 * 1-12/2 * /bin/aa.sh # 奇数月的每天早上7:00运行一次 0 7 * 2-12/2 * /bin/aa.sh # 偶数月的每天早上7:00运行一次
如果要实现每个月最后一天执行任务呢?每个月的天数可能是28、29、30、31。
# 分 时 日 月 周 命令 0 7 31 1,3,5,7,8,10,12 * /bin/aa.sh # 在1,3,5,7,8,10,12月的31号运行 0 7 30 4,6,9,11 * /bin/aa.sh # 在4,6,9,11月的30号运行 0 7 28 2 * /bin/aa.sh # 2月28日运行一次,如果是闰年,则在27号被修改为29号 0 7 27 2 * /bin/bb.sh # 在2月27号的时候运行bb.sh,判断是否是闰年,如果是闰年,就修改该文件前一条的28日为29日。
4)删除cron任务
crontab -r # 删除当前用户的所有crontab任务
5)拒绝某个用户创建crontab任务
同at任务一样,在/etc/cron.deny中添加用户名即可。
vim /etc/cron.deny
leo # leo用户不能创建crontab任务
如果要允许某个用户创建crontab,和at任务一样,从cron.deny中删除用户名,或添加一个cron.allow文件,写入用户名。
6)/etc下的其他与cron相关文件
[root@centos7 etc]# ls /etc/cron* /etc/cron.deny /etc/crontab /etc/cron.d: 0hourly raid-check sysstat /etc/cron.daily: logrotate man-db.cron mlocate /etc/cron.hourly: 0anacron mcelog.cron /etc/cron.monthly: /etc/cron.weekly:
可以看到,除了cron.deny,还有cron.daily、cron.hourly、cron.monthly、cron.weekly,这些文件中都是保存对应周期要执行的任务。
cron.d中的sysstat是每隔一段时间收集系统状态数据,内容如下:
[root@centos7 etc]# cat cron.d/sysstat # Run system activity accounting tool every 10 minutes */10 * * * * root /usr/lib64/sa/sa1 1 1 # 0 * * * * root /usr/lib64/sa/sa1 600 6 & # Generate a daily summary of process accounting at 23:53 53 23 * * * root /usr/lib64/sa/sa2 -A
即,每隔10分钟,执行以下sa1命令,收集数据。
===