任务计划功能
未来的某时间执行一次任务,执行任务后退出!
at 指定时间点,执行一次任务
周期性任务运行,将重复的操作变为一次操作自动运行
cron
一次性任务:at
确认at包是否装上:
[root@centos6 ~]#which at
/usr/bin/at
[root@centos6 ~]#rpm -qf /usr/bin/at
at-3.1.10-49.el6.x86_64
确认at服务是否启动:
centos7:systemctl is-enabled atd
centos6:chkconfig --list atd
at:执行一次性任务,如果有标准输出,会默认发邮件给用户
格式:at [option] TIME
常用选项
-V:版本信息
-l:列出指定队列中等待运行的任务相当于atq
-d:删除指定的任务
-c:查看具体任务内容
-f file:从指定的文件中读取任务
-t time:时间格式
-m:任务完成后,会给用户发邮件,即使没有数据,也会有一个空邮件
时间可定义为:
now+#{minutes,hours,days,weeks}:现在往后加多长时间执行一次任务
例:at now+10minutes
at> echo aaa
at> <EOF>
十分钟之后执行echo命令
创建任务时会自动创建文件:会创建一个随机编号的文件,关机重启任务也不会丢失
/var/spool/at/
允许或拒绝某用户使用计划任务
/etc/at.allow :默认没有此文件,如果有此文件,就看文件中是否有此用户,有则可以设定计划任务,如果
没有则不能定义计划任务,此文件优先级高,看了此文件不会再看deny文件,一行写一个用户
/etc/at.deny :如果没有allow文件,那么在deny文件中的用户不能定义计划任务,此文件中的用户是拒
绝使用计划任务的,一行一个用户
如果两个文件都不存在,那么只由root用户可定义计划任务
run-parts dir:指定目录,将目录下的可执行文件全部执行一遍
例:创建一次性任务,以邮件方式查看
[root@centos6 ~]#at 11:35
at> date
at> ls /root
at> echo 123123
at> <EOT> 输入命令后Ctrl+d键退出
job 2 at 2019-09-09 11:35
[root@centos6 ~]#at -l
2 2019-09-09 11:35 a root
也支持输入重定向方式
at 12:00 << EOF
echo 123
echo 354
EOF
周期性任务:cron
任务计划在单用户模式下是不执行的
确保crond守护进程处于运行状态
centos7:systemctl status crond
centos6:service crond status
计划周期性执行的任务提交给crond,到指定的时间会自动运行
系统cron任务:系统维护
/etc/crontab
用户cron任务
crontab命令生成
日志:/var/log/cron
基于配置文件的cron
/etc/crontab文件中的格式,仅root用户修改此文件
# 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 0和7都是周日
# | | | | |
# * * * * * user-name command to be executed
分 时 天 月 周 用户 命令
*/10 * * * * root /data/bin/checkdisk.sh :每隔十分中就检查一次磁盘;*号表示每的意思,
*/10表示每10分钟,其他的都是每小时,每天,每月
30 2 1,10,20 * 0 root /data/check_disk.sh :如果天和周都有定义,就是或的关系,这个例子是1,
10,20号和周日的2点30分执行命令,如果想要1,10,20,
并且是周日在执行,那就在脚本里写一个判断语句,
date +%w判断是周几,返回的是数字
30 2 * 3-6,12 * root /bin/cat /var/log/messages :3到6月和12月的每天2点30分以root用户
身份执行命令
任务计划中的命令必须是命令的绝对路径,一般情况都是编辑好脚本,这里写脚本的绝对路径运行脚本的
时间表示法:
给予特定的值
*:给定时间点上取值范围内的所有值
#,#,#:离散取值,1,10,20,23天
#-#:连续取值,1-25天
*/#:步长取值,*/10每十分钟
@reboot:下次重启前执行,开机的时候删,关机不会删
/var/spool/cron/:crontab创建的任务文件存放点,以用户名为文件名的任务文件
/var/log/cron :计划任务的日志文件,CMD字段为执行过的命令。
基于命令创建的cron
crontab命令有SUID权限
用户创建任务计划:root也可以
crontab命令:通过类似VIM编辑器的界面编辑计划任务
-e:编辑
-u:仅root用户可运行,指定用户管理cron任务
-r:删除任务,全部删,要删单挑编辑文件
-l:列出cron任务
使用crontab -e创建的任务计划不需要指定用户,当前用户创建的任务
例:当前用户为root,执行crontab -e
内容为:* * * * * /bin/cat /root/file1
错误的:* * * * * root /bin/cat /root/file1 :如果中间加上了用户,它会认为root也是一条命令,
当执行时,没有root命令。会报错
也可使用 crontab -u username -e:使用某用户身份为用户创建计划任务
例:crontab -u cheng -e
内容:* * * * * /bin/cat /root/file1
既然已cheng用户身份创建,邮件也发到了cheng 用户的邮箱,root用户看不到,需要切换用户查看
控制用户权限执行任务
/etc/cron.allow|deny
同样的allow比deny优先级高,有了allow不会再看deny文件
cron特性
注意:任务执行命令的结果中的标准输出和错误会以邮件方式通知给用户
建议:创建脚本时多余的输出给/dev/null,要不一直发邮件,就会产生垃圾邮件
export EDITOR=vim:此项可以为crontab -e创建的任务中加颜色,保存至/etc/profile.d/#.sh
对于cron任务来讲,%有特殊用途,如果在命令中要使用,需要转义,将%放置于单引号中,可不用转义,放入脚本中就可以
系统任务计划
centos6使用/etc/cron.daily/tmpwatch定时清理临时文件,定义了/tmp /var/tmp目录的清理时间
centos7使用systemd-tmpfiles-setup服务实现
配置文件
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles.d/*.conf
命令:systemd-tmpfiles -clean|remove|create configfile