有时候需要对系统进行一些重比较耗时占资源的系统维护工作,或一些重复的操作如每日备份等。最好的方法是把这些任务安排在深夜系统负载最小的时候。linux系统上常使用crontab、at 命令来实施计划任务。计划任务分为一次性计划任务,和周期性计划任务。
一次性计划任务:任务只执行一次后不会再进行第二次
可以使用的命令:at、bath
周期性任务执行:重复执行相同的任务,直到用户删除此任务。
可以使用的命令:crontab、anacron
at命令:
交互式:让用户在at > 提示符输入多个要执行的命令;
批处理:将任务的各需要执行的命令写入文件,由at进行调用
1、交互式计划任务
[[email protected] ~]# at now+3min \\ 定义一个3分钟后执行的任务 at> ls /var \\需要执行的命令,如果有多个可以用enter来换行继续输入 at> <EOT> \\ ctrl+d job 3 at 2016-03-18 09:08
2、批处理创建计划任务
使用-f 指定需要执行的脚本文件
[[email protected] ~]# at now+1min -f /root/backup.sh job 4 at 2016-03-18 09:17
3、查看作业队列
[[email protected] ~]# at -l 1 2016-03-18 09:30 a root 2 2016-03-18 09:40 a root [[email protected] ~]# atq 1 2016-03-18 09:30 a root 2 2016-03-18 09:40 a root
4、删除作业
[[email protected] ~]# at -d 2 \\ 2表示为作业的编号 [[email protected] ~]# atq 1 2016-03-18 09:30 a root
任务计划的执行结果会通过邮件的方式发送给任务提交者;
模糊时间:
now, noon正午, midnight午夜, teatime下午4点, tomorrow明天
**********************************
crontab 设置定时任务
crontab [-l | -r | -e | -u user]
常用选项:
-l:查看自己的cron任务列表;
-e:通过EDITOR变量中定义的编辑器打开用户自己的cron配置文件;
编辑单独的任务都使用-e选项,无论是删除、修改还是新建;
-r:移除crontab文件
-u UserName:为别的用户配置crontab作业,只有管理员才能执行此操作。
(a)、crontab任务计划需要依靠crond服务,要想任务计划生效需保计服务正常运行
# service crond status crond (pid 1814) is running...
(b)、和crontab相关的几个常用的文件
系统cron文件
/etc/crontab
用户cron文件:
/var/spool/cron/UserName
任务计划 黑名单列表
对于不允许用户做任务计划的用户可以写入这个文件中
/etc/at.deny
(c)、cron执行的结果对于那些没有用户的来说,执行成功后会发邮件给root用户,对于有些不需要收到邮件的可以通过输出重定向而拒收邮件:
&> /dev/null
> /dev/null 2>&1
MAILTO=""
/etc/crontab文件:每行定义一个独立的任务;
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # 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 # | | | | | # * * * * * user-name command to be executed
文件中每一行的格式如下所示
分钟 小时 日期 月份 星期 命令
分钟: 从0~59之间的任何数整数。
小时:从0-23之间的任何整数。
日期:从1-31之间的任何整数。(如果指定的月份,则必须是该月份的有效日期)
月份:从1~12之间的任何整数。
星期:从0~7之间的任何整数(0和7都表示星期天),也可以使用sun,mon,tue,wed,thu,fri,sat。
在以上值中,可以使用 * 号表示所有值,如分钟的 * 号表示0~59之间的任何数。
时间表示法:
1、每个时间位都应该使用其可用的有效取值范围内的值;
2、某时间位上的*表示对庆应位的所有有效取值;
3、-: 连续的时间相邻点取值;
4、,: 离散的时间点取值;
5、/#:表示在指定时间范围内每隔#一次;
5-45/3 * * * *
注意1:如果在crontab的用户命令中使用%,得转义为\%
*/1 * * * * /bin/tar -Jcf /tmp/etc.`date +\%F-\%s`.tar.xz /etc/*
注意2:在crontab任务中的command最好使用完整的路径如/bin/tar
练习:
1、每3分钟执行一个“echo "how are you?";
*/3 * * * * /bin/echo "how are you?"
2、每周2、4、6备份/etc/目录至/backup目录中,备份的文件名以当etc_开头并跟上当日的日期作为文件名;
0 0 * * 2,4,6 /bin/tar -Jcf etc_`date +%F`.tar.xz /etc/*
3、每天6、9、12、15、16、17、18查看一下当前系统挂载的所有文件系统,并将查看的结果追加至/tmp/mounts.txt文件中;
0 6,9,12,15-17 * * * /bin/mount >> /tmp/mounts.txt
4、每天每两小时取当前系统内存空间余量,将其保存至/stats/memory.txt文件中;
0 */2 * * * /bin/grep "MemFree:" /proc/memoryinfo >> /stats/memory.txt
或
0 */2 * * * [ -d /stats ] || /bin/mkdir /stats ;/bin/grep "MemFree:" /proc/meminfo >> /stats/meminfo.txt
crontab文件的格式:
空白行会被忽略
# 开头的行是注释;
如何实现秒级别的任务:
* * * * * for i in {0..4}; do /bin/echo "how are you?"; sleep 10; done
每21秒执行一个任务
像这种不是整数的时间,只能采用死循环的方式来进行
while true:; do /bin/echo "how are you?" sleep 21; done
anacron: 最小刻度是天;
是crontab的补充,用于检查crontab中某任务在过去的一个周期内是否没有执行,
如果没有执行,则在开机以后的某时间点让其执行执行一次,无论其周期是否到达;
2 3 * * * some_job