计划任务shell
所谓的计划任务是在将来某一特定的时间执行一次或屡次特定的做业(任务)。实现无需人工干预的状况下执行做业。
bash
1、计划任务的分类编辑器
根据计划任务在将来被执行的次数,分为一次性计划任务和周期性计划任务。
ide
一次性计划任务:只在将来的某一时间执行一次。
oop
周期性计划任务:在将来某一特定时间内循环执行屡次。
ui
2、一次性计划任务url
一次性计划任务经常使用的命令有at,batch。
spa
一、设定一次性计划任务命令行
1)at命令设定一次性计划任务,它是由atd后台进程管理的。要想设置一次性任务需启动atd服务进程。在CentOS中经过/etc/init.d/atd start 命令来启动此服务。 server
在命令行下:
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 #它当即就执行了,由于如今就是系统空闲的时候。
2、周期性任务
周期性任务是在将来某一特定的时间内循环执行特定的做业。是经过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服务
一、cron任务分类
根据cron任务的执行者不一样,将cron分为两类:
系统cron
定义在/etc/crontab中,每行定义一个独立的任务,这是针对于系统级的。
用户cron
定义在/var/spool/cron目录中,每一个用户都有一个与用户名同名的文件,其功能相似于/etc/crontab,每行定义一个独立的任务。这是针对于用户级别的。
二、相关目录和文件
/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服务
三、周期性任务的设定
周期性任务的环境变量和设定格式:
环境变量:
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文件设定
四、丢弃邮件通知:
使用输出重定向:
&>/dev/null
>/dev/null
五、crontab命令其余经常使用用法
-l: 列出已经定义的全部任务
-e: 打开编辑界面定义任务
-r: 移除全部任务 若是是要删除某一条特定的任务,能够经过设定周期任务的三种方式来删除对应任务所在的那一行。
六、其余
anacron: crontab的补充机制
检查有没有过去一个有效周期不曾执行的任务,若是有,在开机后的指定时间点执行一次;
实现秒级别的任务:
* * * * * for i in {1..5};do 脚本;sleep 10;done (每隔10秒)
七、练习
一、每个月执行一次对/目录的备份,备份至/backup目录中,保存的目录名格式为rootfs-2014-07;
# 0 4 1 * * [ -d /backup ] || mkdir /backup; /bin/cp -a / /backup/etc-$(date +'%Y-%m')
二、每周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')
三、天天每两小时取当前系统/proc/meminfo中的以S开头的信息保存至/stats/memory.txt中
# 2 */2 * * * grep -i "^S" /proc/meminfo >> /stats/memory.txt
四、工做日的工做时间内,每小时执行一次'echo "hello"'
# 1 9-17 * * 1-5 echo "hello"