linux定时任务
计划任务
- 创建和管理在指定时间自动执行的任务
- 注意:要使任务在执行时间自动执行,计划任务的服务必须是启动的
计划任务进程分类
- atd进程:需要使用at命令调用,只能执行一次(一次性的)
- crond进程:需要使用crontab命令调用,可以设置周期性执行(每天、每周)(可重复)
一次性计划任务
(1)at命令
既然at命令可以调用atd进程,那么我们就可以查看atd进程
[root@oracle ~]# ps -ef |grep atd rpcuser 905 1 0 08:54 ? 00:00:00 rpc.statd root 1274 1 0 08:54 ? 00:00:00 /usr/sbin/atd root 23178 22888 0 13:53 pts/3 00:00:00 grep atd
- 在指定的日期、时间点自动执行预先设置的一些命令操作,属于一次性计划任务
- 系统服务的名称:/etc/init.d/atd
- 设置格式:at [HH:MM] [yyyy-mm-dd]
- 后面[yyyy-mm-dd]如果不写,就表示当天的执行任务
事例:
[root@oracle hang]# at 14:09 at> touch lihanghang at> <EOT> job 1 at 2017-06-18 14:09 [root@oracle hang]#
at后面输入时间之后直接回车,然后输入我们想要定时执行的命令,退出的时候Ctrl+D
(2)atq命令
- 用途:查看当前设置的at任务列表(启动atd服务)
- 同:at -l
当有一个任务还咩有执行的时候,我们通过这个命令就可以查看到
[root@oracle hang]# atq
1 2017-06-18 14:09 a root
(3)atrm命令
- 用途:删除执行任务编号的at任务
- 格式:atrm 编号
- 同:at -d
[root@oracle hang]# at 14:23 at> touch a at> <EOT> job 4 at 2017-06-18 14:23 [root@oracle hang]# atq 4 2017-06-18 14:23 a root [root@oracle hang]# atrm 4 [root@oracle hang]# atq
设定一个定时任务之后,通过命令atq查看任务列表,得到任务编号之后,通过atrm命令将定时任务删除
(4)at -c 任务号
- 查看任务的具体内容
(5)at命令的常用格式
- at [HH:MM]
- at [HH:MM] [yyyy-mm-dd]
- at now +数字 [minutes|hours|day|weeks]
at now 5 minutes:表示五分钟之后执行
(6)at 时间 -f文件
- 使用文件中的命令作为计划任务
- at now +5 minutes -f /root/test.sh
(7)at计划任务文件位置
- /var/spool/at/a开头的文件
- 任务执行完毕,文件消失
[root@oracle kernel]# cd /var/spool/at/ [root@oracle at]# ls a00006017ce6f5 spool [root@oracle at]# at -d 6 [root@oracle at]# ls spool
当将这个执行计划删除之后这个任务文件就紧接着消失了
(8)at计划任务文件位置
- /etc/at.deny:只有改名单里面的人不可以使用
- /etc/at.allow:只有该名单里面的人可以使用
周期计划任务
查看crond进程信息
[root@oracle etc]# ps -ef |grep crond root 1263 1 0 08:54 ? 00:00:00 crond root 23419 1331 0 14:51 pts/0 00:00:00 grep crond
(1)crontab命令
- 按照预先设置的时间周期(分钟、小时、天....)重复执行用户指定的命令操作,属于周期性计划任务
- 服务名称:/etc/init.d/crond
- 主要设置文件:用户定义的设置,位于文件:/var/spool/cron/用户名
- 那个用户创建的计划任务,计划任务就在那个用户下面
(2)cron服务配置文件
- 位于文件:/etc/crontab
- 系统cron就在该文件定义,是为了维护系统能够正常运行的,任务的格式也和用户cron有点不同,多了一个username
- crond计划任务里面的命令有时候可能不会执行,因为cron的环境变量PATH跟系统PATH不太一样,他的PATH的默认值为PATH=/sbin:/bin/:/usr/sbin:/usr/bin,所以这就造成很多命令不能使用,所以解决的办法有两个,可以自己设定cron的PATH环境变量,也可以用命令的绝对路径,比如ls 我们可以使用:/bin/ls
文件crontab的内容 [root@oracle etc]# cat 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 前面四个等于,相当于定义了四个变量 文件内容很像脚本,这个的PATH路径,如果我们输入执行的命令不在PATH下的文件夹下面,使用的时候就需要使用绝对路径了 crontab只会在/sbin、/bin、/usr/sbin、/usr/bin下查找命令,如果命令不在这些目录中,应该要使用绝对路径 这里定义了格式是什么, 第一个*:代表分钟,范围是0~59 第二个*:代表了小时,范围是0~23 第三个*:代表了日期天,范围是0~31 第四个*:代表了月份,范围是1-12 第五个*:代表了星期,范围是0-6
(3)cron服务的日志文件
- 位于文件:/var/log/cron
(4)管理cron计划任务
- 编辑计划任务:crontab -e [-u 用户名]
- 查看计划任务:crontab -l [-u 用户名]
- 删除计划任务:crontab -r [-u 用户名]
(5)时间数值的特殊用法
- *:表示该范围内的任意时间
- ,:表示间隔的多个不连续时间
- -:表示一个连续的时间范围
- /n:指定间隔的时间频率
示例:
- 0 17 * * 1-5 周一到周五每天17:00
- 30 8 * * 1,3,5 每周一、三、五的8:30
- 0 8-18 * * * 八点到18点整
- 0 12 */3 * * 每隔3天的12点整
(6)每天早上7:50自动开启sshd服务,22:50自动关闭
- 执行crontab -e命令之后,就会进入编辑界面
- 添加50 7 * * * service sshd start和50 22 * * * service sshd stop两行内容保存并退出
- 查看计划任务:
- [root@oracle db_1]# crontab -l
- 50 7 * * * service sshd start
- 50 22 * * * service sshd stop
- 查看计划任务文件位置,并查看内容
- [root@oracle cron]# pwd
- /var/spool/cron
- [root@oracle cron]# cat cron
- 50 7 * * * service sshd start
- 50 22 * * * service sshd stop
- 注意:这里我们要使用which命令查看计划任务命令是否在/sbin、/bin、/usr/sbin、/usr/bin下,否则我们要是会用绝对路径
周期计划任务注意事项
(1)资源分配不均
- 多个计划任务同时运行
- 如果多个任务同时运行,可能就会占用太多的cpu资源,可能就会导致系统夯住
(2)安全检查
- 防止有非法计划任务
- 定时检查一下执行任务,防止有人添加非法的计划任务
(3)周和日、月不可同时并存
- 容易导致计划任务时间混乱
- 防止我们设置的几月几号没有这个时间点
anacron程序
- 弥补cron在系统关机后不能执行计划任务的问题
- 不能替代cron
- 会被每个小时被执行一次,脚本在/etc/cron.hourly
- 按天、周或月为单位去检查系统未进行的cron任务
- /var/spool/anacrom
- 服务名称:/etc/init.d/anacrond
- 开机时自动运行,然后将未执行的计划任务执行一遍后,anacron就会自动停止,所以我们在查看这个进程的时候就找不到,但是cron进程可以找到
- [root@oracle etc]# ps -ef |grep anacrontab
- root 1637 1415 0 23:57 pts/1 00:00:00 grep anacrontab
- [root@oracle etc]# ps -ef |grep cron
- root 1302 1 0 22:35 ? 00:00:00 crond
- root 1643 1415 0 23:57 pts/1 00:00:00 grep cron
[root@oracle anacron]# ls
cron.daily cron.monthly cron.weekly
[root@oracle anacron]# pwd
/var/spool/anacron
(1)系统自带的计时任务存放目录,使用anacrond
[root@oracle etc]# ls cron
cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/
(2)anacron服务配置文件
- 位于文件:/etc/anacrontab
查看这个配置文件 [root@oracle etc]# cat /etc/anacrontab # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly 1:任务频率 5:延迟时间 cron.daily:任务名称 /etc/cron.monthly:执行命令 run-parts:这个选项会将/etc/cron.daily目录下的文件全部执行
开机要执行的命令或者脚本应该添加到
- /etc/rc.local
- 是一个链接文件,链接到改目录下的rc.d/rc.local
[root@oracle etc]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Dec 24 12:36 /etc/rc.local -> rc.d/rc.local
- 所以如果我们要开机执行命令就vi这个文件,并在里面添加内容
[root@oracle etc]# vi rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local
2017-06-20