> Linux教程 > 系统运维 >

Linux周期性任务计划

一、Linux任务计划
1、一次性任务计划执行:
(1)at
(2)batch
2、周期性任务执行:
(1)crontab
(2)anacron

二、一次性任务执行
1、at命令:
分类:
(1)交互式:让用户在at>提示符下输入多个要执行的命令

(2)批处理:将任务的个命令写入文件由at进行调用

2、at交互式处理常用格式: at TIME
(1)在at>下输入命令即可

(2)按Ctrl+D可提交任务(作业)

(3)例:

# at 3:44
at> cat /etc/fstab
按Ctrl+D
at><EOF>


3、查看任务命令
(1)格式:at -l

(2)命令atq也可以实现查看任务队列

(3)例:

# at -l
11  2016-11-04 02:55 a root
任务号 时间 队列字母 发起任务者


4、添加任务队列
(1)格式:at -q 字母 TIME

(2)例:

# at -q a 03:55
# at> cat /root/hh.sh
# at -l


5、删除一个尚未执行的作业
(1)格式:at -d job_num

(2)或者用atrm命令:atrm job_num

(3)例:

# at -l             先查看
# at -d 14
# at -l             检查
或者
# atrm 14
# at -l


6、at批处理常用格式:
(1)at -f /PATH/TO/FILE TIME

(2)例:

# vim /root/at.txt
cat /etc/fstab
ls
保存退出
# at -f /root/at.txt 4:50
# at -l         检查


7、TIME的指定方式
(1)模糊时间:
①now ②noon(中午12点) ③midnight(晚上12点) ④teatime(下午4点)
⑤tomorrow

(2)例:

# at now+3min
可制定3分钟后的作业

# at -q a noon
可指定任务队列为a,中午的作业。

# at -f /root/at.txt now+1day
可指定从现在开始后的一天执行批处理任务

# at -f /root/at.txt now+2days
可指定从现在开始后的两天执行批处理任务


(3)TIME的指定十分灵活,具体可参照man手册。

8、任务的执行结果会通过邮件的方式发送给任务提交者
(1)使用mail命令:交互模式查看处理接收邮件

(2)交互模式发送邮件
①指定发送主题:mail -s “suject” 接收者

②可用输入重定向指定发送内容:< /path/to/somefile
例:



③可通过管道来提交邮件内容:
例:

# echo -e "Hello\nking" | mail -s "hello,buddy" root


9、batch命令
(1)特点:与at不同的是,不能指定时间:它自动选择系统空闲时间执行。

10、文件/etc/at.deny 为at命令作业控制列表(黑名单),可以定义谁能使用at命令,谁不能使用。
(1)写入用户名,该用户就不能使用at命令
(2)例:

# vim /etc/at.deny
hadoop
保存退出
# su - hadoop
$ at 14:30

显示结果:
You do not have permission to use at.



二、周期性任务计划(默认以分钟为最小单位)
1、cron
(1)crond:守护进程,运行在后台,随时监视着进程,等待执行。
服务进程的工作方式:阻塞、轮询

2、cron分类
(1)系统cron
①系统cron的配置文件在/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


③上述文件内容中的时间表示法:
a、每个时间位都应该使用其取值范围内的值。

b、某时间位上的*表示对应位的所有有效取值。

c、- 表示连续的相邻时间点的取值。
例:

30-35 7 * * * /bin/echo "hello"
表示每天7点30分~7点35分执行一次echo "hello"任务


d、, 表示离散的时间点取值
例:

5,35 * * * * /bin/echo "hello"
表示每小时第5分,第35分执行一次echo "hello"任务。

e、/# 表示在指定时间范围内每隔#分钟执行一次任务
例:

5-45/3 * * * * /bin/echo "hello"
表示每小时的5分~45分内,每隔三分钟执行一次echo "hello"任务。

0 */2 * * * /bin/echo "hello"
表示在每天的0分开始,每隔两小时执行一次echo "hello"任务


④每次任务执行后的结果都会发送去MAILTO指定的用户邮箱中去

⑤注意:可以通过输出重定向或者指定MIALTO为空而拒收邮件
例:

0 */2 * * * /bin/echo "hello" &> /dev/null

或者指定MAILTO指定为空拒收邮件
# crontab -e
MAILTO=""
保存退出




(2)用户cron
①使用crontab命令实现
选项:
-l:查看自己的cron任务列表

# crontab -l


-e:通过EDITOR变量中定义的编辑器,打开用户自己的cron配置文件
编辑单独的任务都使用-e选项,无论删除,修改还是新建
例:

# crontab -e
*/3 * * * * /bin/echo "Hello."


-r:移除crontab文件

# crontab -r


(3)如果是管理员
①可以使用命令:crontab -e -u UserName
为别的用户配置cron作业
②例:

# crontab -e -u hadoop
*/3 * * * * /bin/echo "hello"
保存退出



(4)提醒:如果在crontab -e命令下编辑命令时使用%,得转义\%

例:

# crontab -e
5 * * * * /bin/touch ~/testfile_`date +\%Y-\%m-\%d`.txt
保存退出


或者在使用单引号括起使用%的部分,%可以不用转义

例:

# crontab -e
5 * * * * /bin/touch ~/testfile_`date +'%Y-%m-%d'`.txt


(6)如何使用秒级别任务

①如果只使用该格式

# crontab -e
*/21 * * * * /bin/echo "how are you?"


每分钟每隔21秒执行一次echo “hello”任务,但是,最后的21并不是完全相隔了21秒,而是18秒,有所误差。

②可以使用下列格式解决上述问题:

# crontab -e
* * * * * fori in {0..4};do /bin/echo "how are you?";sleep 21;done
或者
*/21 * * * * while true;do /bin/echo "how are you";sleep 21;done


③建议以秒级别任务用脚本实现

3、anacron
(1)最小刻度是天。在/etc/anacron文件下配置。
(2)anacron是crontab的补充,用于检查crontab中某任务在过去一个周期内是否没有执行,如果没有执行,则在开机以后的某时间点让其执行一次,无论周期是否到达。

三、重点总结:
1、at命令的使用

2、crontab命令的使用

3、crontab中的时间表示法:

4、crontab中的PATH环境变量

5、在时间表示法中,从左到右的*号为低到高
则如果高级的*号有值,低级的*号一定要有具体值。
例:

0 3-18/3 * * * /bin/echo "Hello"


其中0那个时间位必须要有!!!




(责任编辑:IT)