计划任务
所谓的计划任务是在未来某一特定的时间执行一次或多次特定的作业(任务)。实现无需人工干预的情况下执行作业。
一、计划任务的分类
根据计划任务在未来被执行的次数,分为一次性计划任务和周期性计划任务。
一次性计划任务:只在未来的某一时间执行一次。
周期性计划任务:在未来某一特定时间内循环执行多次。
二、一次性计划任务
一次性计划任务常用的命令有at,batch。
1、设定一次性计划任务
1)at命令设定一次性计划任务,它是由atd后台进程管理的。要想设置一次性任务需启动atd服务进程。在CentOS中通过/etc/init.d/atd start 命令来启动此服务。
在命令行下:
at TIME
at> COMMAND1
at> COMMAND2
...
at>
Ctrl+d:提交任务
TMIE支持的格式有:
格式 | 示例 |
HH:MM | 13:12 |
MMDDYY MM/DD/YY DD.MM.YY YYYY-MM-DD | 030914 03/09/14 09.03.14 2014-03-09 |
AM PM | 4am 3pm |
特定字符 + | now noon midnight teatime +{minutes|hours|days|weeks} |
组合使用 | now + 3min 4pm + 1days teatime + 3hours |
[root@server ~]# at now + 10min at> ls /etc/passwd at> cat /etc/issue at> date +%F-%D at> <EOT> job 4 at 2014-07-12 11:33 [root@server ~]# at 2pm at> ls /etc/passwd at> <EOT> job 5 at 2014-07-12 14:00 [root@server ~]# atq 4 2014-07-12 11:33 a root 5 2014-07-12 14:00 a root [root@server ~]# at 17:00 at> date at> <EOT> job 6 at 2014-07-12 17:00
at是通过作业队列来管理的,通过at后者at -l命令查看作业队列
[root@server ~]# atq 6 2014-07-12 17:00 a root #前面的数字是作业的ID号,删除作业的时候可以用到 8 2014-07-12 11:31 a root 5 2014-07-12 14:00 a root
删除不想执行的任务 at -d 作业ID 或者 atrm 作业ID
[root@server ~]# atq 6 2014-07-12 17:00 a root 5 2014-07-12 14:00 a root [root@server ~]# atrm 6 [root@server ~]# atq 5 2014-07-12 14:00 a root [root@server ~]#
作业执行完以后,是以本地邮件的方式通知作业的提交者。
可以通过/etc/at.allow和/etc/at.deny 2个文件来控制用户是否可以使用at来设置一次性任务。
2)batch功能同at,但相比于at而言,无需指定其特定的时间。系统会选择系统资源比较空闲的时候执行指定的作业。
[root@server ~]# batch at> ls . at> <EOT> job 12 at 2014-07-12 11:42 You have mail in /var/spool/mail/root #它立即就执行了,因为现在就是系统空闲的时候。
二、周期性任务
周期性任务是在未来某一特定的时间内循环执行特定的作业。是通过cron机制来完成相应功能的。是由后台进程crond一直在监控。
通过“/etc/init.d/crond status”命令语句来查看crond的状态,如果状态是“is stopped.”,需要启动此服务,执行“/etc/init.d/crond start;chkconfig crond on”。
/etc/init.d/crond status 查看crond的状态
/etc/init.d/crond stop 关闭crond服务
/etc/init.d/crond start 打开crond服务
1、cron任务分类
根据cron任务的执行者不同,将cron分为两类:
系统cron
定义在/etc/crontab中,每行定义一个独立的任务,这是针对于系统级的。
用户cron
定义在/var/spool/cron目录中,每个用户都有一个与用户名同名的文件,其功能类似于/etc/crontab,每行定义一个独立的任务。这是针对于用户级别的。
2、相关目录和文件
/etc/cron.hourly/ 每个小时要执行的脚本的目录
/ect/cron.daily/ 每个天要执行的脚本的目录
/etc/cron.monthly/ 每个月要执行的脚本的目录
/etc/cron.weekly/ 每个周要执行的脚本的目录
/etc/cron.deny 只有cron.allow文件中列出的用户才能使用cron服务,同时忽略cron.deny文件
/etc/cron.allow 如果cron.allow文件不存在,cron.deny文件中列出的用户将被禁止使用cron服务
3、周期性任务的设定
周期性任务的环境变量和设定格式:
环境变量:
SHELL=/bin/bash #默认shell解释器
PATH=/sbin:/bin:/usr/sbin:/usr/bin #默认环境PATH的路径,所以在设定周期性任务的话有时要写全脚本的路径
MAILTO=root #如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ #默认的家目录
格式:
# .---------------- 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 #主要有3部分组成,第一部分 * * * * * 所代表的时间是:minute hour day month day # * * * * * 每分钟 # 2 */2 * * * 每隔2小时 */#:在对应的时间位的有效取值上每#一次 # 3 4 * * 1,3,5 每周1,3,5 ','代表离散取值 # 3 9-17 * * * 每天9-17'-'某个时间位上的连续区间 #注意:在设置时间是,比它小单位一般都是确定的 #第二部分是:user-name 用户名,这一部分在编辑/etc/crontab设定周期性任务时,需要指定用户名。其他两中方式不需要 #第三部分是 command to be executed 可执行的命令或者是脚本。如果有run-parts关键字,后面是脚本所在的目录 #1 * * * * root run-parts /etc/cron.hourly/
设定周期性任务的方式有三种:
1)通过crontab命令
crontab [-u USER_NAME] -e
此时会打开一个编辑器,按照相应的格式就可以设定。
2)通过编辑/var/soop/USER_NAME文件设定
3)通过编辑/etc/crontab文件设定
4、丢弃邮件通知:
使用输出重定向:
&>/dev/null
>/dev/null
5、crontab命令其他常用用法
-l: 列出已经定义的所有任务
-e: 打开编辑界面定义任务
-r: 移除所有任务 如果是要删除某一条特定的任务,可以通过设定周期任务的三种方式来删除对应任务所在的那一行。
6、其他
anacron: crontab的补充机制
检查有没有过去一个有效周期未曾执行的任务,如果有,在开机后的指定时间点执行一次;
实现秒级别的任务:
* * * * * for i in {1..5};do 脚本;sleep 10;done (每隔10秒)
7、练习
1、每月执行一次对/目录的备份,备份至/backup目录中,保存的目录名格式为rootfs-2014-07;
# 0 4 1 * * [ -d /backup ] || mkdir /backup; /bin/cp -a / /backup/etc-$(date +'%Y-%m')
2、每周3,5,7备份/proc/cpuinfo文件至/backup/cpu.info/目录中,保存的文件名为cpu-2013081009;
# 3 1 * * 3,5,7 [ -d /backup/cpu.info/ ] || mkdir -p /backup/cpu.info/; /bin/cp -a /proc/cpuinfo /backup/cpu.info/cpu-$(date +'%Y%m%d%H')
3、每天每两小时取当前系统/proc/meminfo中的以S开头的信息保存至/stats/memory.txt中
# 2 */2 * * * grep -i "^S" /proc/meminfo >> /stats/memory.txt
4、工作日的工作时间内,每小时执行一次'echo "hello"'
# 1 9-17 * * 1-5 echo "hello"
本文出自 “逆水寒” 博客,转载请与作者联系!