设置多长时间以后执行某个操作,大概是延时任务的最简单形象的解释.通过用命令指定未来某一时间执行某一动作,就是系统延时任务的目的.这一操作可以用来进行自动化的运行维护或者清理等等目的.通常来说,系统延迟任务通过at
命令来实现.
at 23:00 ##23:00时执行延迟任务
at>rm -rf /mnt/* ##进入编辑模式编写任务命令,清空mnt目录
at> ##按Ctrl+D退出编辑模式,延时任务设置完成
at -l ##查看任务列表
at -c 任务号 ##查看指定任务的具体内容
at -r 任务号 ##取消指定任务
设定延迟任务时,at 时间
回车之后会要求编辑任务内容,任务内容编写完毕后按Ctrland D按键结束at
界面,定时任务设置成功进入等待模式.
由此我们得知,当到达设置的延迟或者时间时任务就会执行,但如果任务有输出呢?它会呈现再桌面或者终端中吗?事实上并不会,他不会表现为输出而是会将输出内容以邮件的方式发送给任务的发起用户.
系统中默认时没有安装邮件服务和邮件阅读工具的因此还需要事先进行部署.
mail -u root ##查看超级用户收到的邮件
1 ##查看第一封邮件
q ##退出邮件阅读工具
> /var/spool/mail/root ##清空root用户的邮件
默认情况下,所有用户都具有执行at
命令的权限,但在实际多人环境应用中,这样的操作可能会出现大量不必要的延迟任务,使得系统负载变大.
该如何限制用户执行的权限呢?
at
命令原生提供的黑白名单机制就可以实现这个目的.
/etc/at.deny ##at命令黑名单,系统默认提供,此文件中出现的用户无法执行at命令
/etc/at.allow ##at命令白名单,系统默认不提供,只有此文件中出现的用户才能执行at命令
黑名单文件系统默认是提供了的可以直接进行编辑.
而白名单文件则需要自行创建.
而且执行逻辑上,当白名单出现之后,黑名单不会再被检测也不会生效.
需要注意的是,和大部分命令一样,限制超级用户的行为是无效且没有意义的,root用户并不会受两者的约束.
刚才我们学过了延迟任务,其特点是设置一个时间节点或等待时间,到达指定时间后执行某操作.
不难看出这样的操作是单向的不可复用的.
那如果我们需要周期性的定时执行某操作,比如闹钟,定时清理,定时刷新等等该如何.
这就要用到定时任务了.
定时任务的主要效果是使得计算机能够每隔一定时间周期性的执行固定操作,满足用户周期性自动化行为的需求.
定时任务的主要设置通过crontab
命令来实现.
crontab -e ##执行文字编辑器来设定时程表
crontab -l ##列出目前的时程表
crontab -r ##删除目前的时程表
crontab -u root -e ##-u表示设定指定用户的时程表,当然前提是有对应的操作权限
/var/spool/cron/username ##任务保存文件
通过上面的命令可以进行用户级的定时任务的设置.
值得一提的是crontab -e
建立定时时自带检测,如果语法错误会取消保存要求重新编写.
* * * * * 命令 ##用户级定时任务基本格式
如上为用户级定时任务的编写格式,前5个*
分别表示 “分” , “小时” , “日” , “月” , “周”.
除了数字之外还可以使用特殊字符:
星号*
:表示所有可能的值,可以理解为每.
逗号,
:用逗号隔开的值表示一个列表范围,如1,2,3 * * * *每天每小时的第一、第二、第三分钟.
中杠-
:用中杠隔开的值表示一个数值范围,如1-10 * * * *每天每小时的1到10分钟.
正斜线/
:指定执行任务的间隔频率,如 0 10-18/2 * * *每天的十点到十八点间隔2小时执行.
和at
命令类似,crontab
命令同样拥有黑白名单机制来对用户权限进行限制.
/etc/cron.deny #文件中列出的用户不能使用crontab
/etc/cron.allow #文件中列出的用户可以使用crontab
同样,黑名单文件为系统默认提供,而白名单文件需要自行创建.
设置白名单后黑名单的设置会失效,记载在黑名单中的内容也不会再起作用.
刚刚介绍时专门描述了这样的设置是用户级别的定时任务.
与之对应的是系统级别的定时任务.
系统级别定时任务主要用于执行系统周期性要执行的工作,比如写缓存数据到硬盘、日志清理。/etc/crontab
是系统任务调度的配置文件。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="root"
HOME=/
# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
可以看到系统级别的定时任务与用户级别的定时任务最大的不同是格式中多了执行用户的设定.
通过指定用户可以使得目标用户完成用户操作,当然成功执行的前提是目标用户拥有执行目标操作的权限.
值得一提的是,系统级的crontab用crontab -l
时查看不到的.
# 每分钟执行一次
* * * * *
# 每小时的第3和第15分钟执行
3,15 * * * *
#在上午的8点到11点的第3和第15分钟执行
3,15 8-11 * * *
#在每隔2天的上午8点和11点的第3和第15分钟执行
3,15 8-11 */2 * *
#每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1
#每晚的21:30执行
30 21 * * *
#每月1、10、22日的4:30执行
30 4 1,10,22 * *
#每周六、日1:10执行
10 1 * * 6,7
#每天18:00到23:00之间每隔30分钟执行
0/30 18-23 * * *
#星期六的23:00执行
0 23 * * 6
#每小时执行一次
* */1 * * *
#晚上11点到早上7点之间,每小时执行一次
* 23-7/1 * * *
#每月的4号与每周一到周三的11点
0 11 4 * 1-3
#一月一号的4点
0 4 1 1 *
早先我们学过rm
的方式来删除文件.但是即使是临时文件也应该有其生命周期.再临时文件的生命周期结束后再对其进行删除才符合系统维护的一般逻辑.
systemd-tmpfiles
是专门用于管理临时文件的守护程序.
在文件的生命周期结束后,该服务会按照生效的规则对目标文件进行清理.
同时,如果出现了临时文件但是生命周期还未结束,则不会被清理.
/lib/tmpfiles.d/ ##临时文件清理策略的保存目录
##通过在该目录下建立新的配置文件可以实现自定义的文件清理
systemd-tmpfiles --clean ##清理命令
systemd-tmpfiles --create 文件 ##使规则立刻生效
systemd-tmpfiles --cat-config ##显示全部配置文件的内容