在我们日常服务器管理中,不管是Windows还是Linux都不可避免的会用到计划任务这个东西。比如说我们某天要在凌晨3点进行一次完整备份,作为运维人员咱不能设个闹钟凌晨三点爬起来一台台的敲命令打包上传到文件服务器吧。假如你够勤快、有干劲、精神好,可服务器有100台呢....
通常我们的做法是写个脚本,指定时间计算机自动执行完成任务然后把错误输出发邮件到邮箱。第二天检查下邮件就可以了。
计划任务分为2种,一种是在未来的某个时间点执行一次任务,然后是周期性的执行任务。
linux下某个时间点执行一次任务的命名有at、batch
at 命令的用法如下
at 时间
at> COMMAND
下面可以写多个命令,写好之后按Ctrl+d提交
例:我们要在21:20执行当前目录下的./check.sh跟debug.sh,如果时间已经过了那么就下一个21:20执行
时间我们可以指定相对时间和绝对时间
指定绝对时间:HH:MM DD.MM.YY
例:at 11:30 20.03.2016 在2016年03月20 11:30开始执行
指定相对时间:now+#
常用单位有:m(分钟)、h(小时)、d(天)、w(星期)
例:at now+3m 从现在开始3分钟后开始执行
设置好了之后要想查看任务列表输入:at -l
删除一个任务则使用:at -d # 或者atrm #
例:at -d 1 删除at任务列表的1号任务
atrm 1
我们如果不想某个用户使用at命令,则在/etc/at.deny文件中把该用户的用户名放进去就好了(黑名单功能)
batch命令跟at命令的区别在于batch命令不需要指定时间,它会自动选择系统空闲的时候执行一次。
如果需要周期性的执行任务,则需要用到crontab命令,这个命令其实操作一个叫cron的服务。我们可以对其进行开始、停止、重启,命令跟启动apache之类的服务是一样的。
service crond start
service crond stop
service crond restart
命令用法:
crontab -e 编辑计划任务
假如我们要增加一条计划任务
先输入crontab -e 然后开始编辑任务,编辑完按wq保存退出
格式为:*(分钟)*(小时) *(天) *(月) *(星期) 命令/脚本
例:*/5 * * * * /home/usr1/check.sh 每五分钟执行check.sh这个脚本
crontab -l 查看当前计划任务列表
crontab -r 移除所有任务,如果只删除一个任务的自行用crontab -e 脑补
经常在论坛上看到有人发帖问为什么我写的cron任务怎么不正常执行?
这里就涉及到环境变量了,cron的所有命令都去PATH的环境变量指定的路径下去找
如果你写的命令放在其他路径,cron就找不到命令自然就执行不了
解决方法:
在编辑任务的时候使用命令的绝对路径,如果是脚本的话写脚本的时候先定义脚本的环境变量,这样脚本执行的时候就使用的自身的环境变量了。