在windows下,系统提供了计划任务功能,我们可以在“控制面板 -> 性能与维护 -> 任务计划”找到,它用于安排自动运行的任务。通过“添加任务计划”引导,我们可建立一个定时执行的任务。
在linux下,你可能已经发现系统常常自动地执行一些任务,是谁在支配它们工作?在某个时间点,你想让备份程序自动执行,这该怎么做?例行的工作又分为一次性定时工作与循环定时工作,哪些进程在负责这些?如果你想在老婆生日的前一天,发出一封信提醒自己不要忘记,又该怎么做?
一次性定时计划任务at,可以实现。
1. 命令格式
at [参数] [时间]
2. 命令功能
在一个指定的时间,执行一次性的定时计划任务。需要在系统中安装at命令包,并开启守护进程atd
3. 命令参数
-m,当指定的任务完成之后,将给用户发送邮件,即使没有标准输出
-I,atq的别名
-d,atrm的别名
-v,显示任务被执行的时间
-c,打印任务的内容到标准输出
-V,显示版本信息
-q <列队>,使用指定的列队
-f <文件>,从指定文件读入任务,而不是从标准输入读入
-t <时间参数>,以时间参数的形式,提交要运行的任务
at使用一套相当复杂的方法来指定时间:绝对计时法,相对计时法,
绝对计时法
在当天,以hh:mm(小时:分钟)格式来指定时间,假如该时间已经过去,那么就放在第二天执行。
可以使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等模糊词语来指定时间。
可以采用12小时制,即在时间后加上AM(上午)或PM(下午)来说明是上午还是下午。
指定命令执行的具体日期,格式为month day(月 日),mm/dd/yy(月/日/年),dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。
还可以使用相对计时法,这对于制定不久就要执行的任务很有好处。
相对计时法
- 格式:now+count time-units,其中now是当前时间;count是时间数量,可取几小时,几天等;time-units是时间单位,可以是minutes(分钟),hours(小时),days(天),weeks(星期)。
另一种计时方法是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
- TIME:时间格式,这里可以定义什么时间,进行at任务。格式有:
HH:MM
ex> 04:00
- 在今日的HH:MM时刻进行,若该时刻已经超过,则在明天的HH:MM执行此任务。
HH:MM YYYY-MM-DD
ex> 04:00 2009-03-17
- 在某年某月某日某时刻,强制执行该项任务
HH:MM[am|pm] [Month] [Date]
ex> 04pm March 17
- 在某年某月某日的某时刻,强制进行该项任务
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes
ex> 04pm + 3 days
也就是说,在某个时间点再加几个时间段后,才进行该项任务。
4. 使用实例
例一:安装at命令,并启动atd服务
命令:
/etc/init.d/atd {start|stop|restart|condrestart|status}
// []表示可以省略的选项,{}表示必要选项,|表示或
说明:要使用一次性计划任务时,Linux必须启动负责此任务的服务进程,即atd服务。 然而并非所有的Linux发行版都默认将其启动。因此,我们需要手动开启atd服务。
# /etc/init.d/atd stop
停止 atd:[确定]
# ps -ef|grep atd
root 25062 24951 0 14:53 pts/0 00:00:00 grep atd
# /etc/init.d/atd start
[确定] td:[确定]
# ps -ef|grep atd
root 25068 1 0 14:53 ? 00:00:00 /usr/sbin/atd
root 25071 24951 0 14:53 pts/0 00:00:00 grep atd
# /etc/init.d/atd restart
停止 atd:[确定]
[确定]td:[确定]
# systemctl enable atd // 开机自启动
例二:在三天后的下午5点,执行/bin/ls
命令:at 5pm + 3 days
# at 5pm + 3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00
说明:退出at命令,要用ctrl+d
例三:明天17点钟,输出时间到指定文件
命令:at 17:20 tomorrow
# at 17:20 tomorrow
at> date > /root/2013.log
at> <EOT>
job 8 at 2013-01-06 17:20
例四:在执行计划任务之前,用atq查看系统有无此任务计划
命令:atq
# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
例五:删除已经设置的任务
命令:at rm 7
# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
# atrm 7 // 删除序号
# atq
8 2013-01-06 17:20 a root
例六:显示已经设置的计划任务内容
命令:at -c 8
# at -c 8 // 显示8号任务的内容
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此处省略n个字符
date > /root/2013.log
5. at权限控制
既然是计划任务,那么系统应该有相应的执行方式,并将这些计划任务排进任务列表。事实上,我们使用at产生所要运行的计划任务,并以文件的形式写入/var/spool/at/目录内,该工作便能等待atd的取用与运行。
考虑到系统安全,并不是所有人都可以执行at计划任务。在遭受黑客攻击后,主机当中多了许多黑客程序,这些程序非常可能是运用一些计划任务来运行或搜集系统的运行信息,并定时发送给黑客。所以除非是你认可的帐号,否则不要让其他用户使用at。
那怎样达到安全可控地使用at呢?
我们可以使用/etc/at.allow和/etc/at.deny来限制at的使用,加上这两个文件后, at 的工作情况是这样的:
先找到/etc/at.allow文件,写在这个文件中的用户才能使用at,没有写在文件中的用户,则不能使用at (即使没有写在at.deny文件中)
如果/etc/at.allow不存在,就寻找/etc/at.deny文件。写在at.deny的用户,不能使用at,没有写在at.deny文件的用户,可以使用at命令。
如果两个文件都不存在,那只有root用户可以使用at。
通过这个说明,我们知道/etc/at.allow是较为严格的管理方式,而/etc/at.deny则较为松散。因为帐号没有在该文件中,就能运行at。
在一般的linux发行版中,系统假设所有用户都是可信的,因此通常会保留一个空的/etc/at.deny文件,意思是允许所有用户使用at(你可以自行检查一下该文件)。如果不希望某些用户使用at的话,你可以将用户名写入/etc/at.deny中,一个帐号写一行。