最近在学习Linux操作系统。学到了关于定时任务的章节,作为一个总结写下这篇文章。在Linux中,我们可以将耗时大的任务如复制大文件,压缩、解压缩大文件等放进定时任务中(深夜执行,因为工作时间访问量大,这类操作会影响系统运行)。
Linux操作系统中关于定时任务主要有种操作方式:
1. at 一次性定时任务
2. crontab循环定时任务
3. anacron配置
(1)at一次性定时任务
1. 确定at是否已经安装
chkconfig --list | grep atd
一般at是系统必定安装的程序(服务)
2. at服务的启动
service atd restart
3. 查看状态
service atd status
其他at管理命令
1. 查看系统下有的at任务
atq
2. 删除指定的任务
atrm [工作号]
关于at命令的用户访问权限控制(服务的控制机制)
系统中默认有at.deny文件
如果系统中两个文件都不存在,那么只有root用户可以使用at命令
因此在配置用户功能的时候需要写at.allow和at.deny文件
at命令参数:
格式:
at [选项] 时间
选项:
-m : 当at工作完成后,无论是否命令有输出,都用email方式通知执行at命令的用户
-c : 工作号,显示该工作的实际内容
输入时间之后会显示
at> [要求输入at执行的任务]
例如:
1. 数据同步,使内存中的数据与磁盘数据同步
at>/bin/sync
2. 在指定时间重启
at>/sbin/shutdown –r now
实际使用中不建议使用定时任务来重启,应该使用人工,以避免在操作系统自动重启的过程中出现一些偶然的错误而导致重启失败。
(2)crontab循环定时任务
此方式平常用得比较多,定时任务会保存在临时文件中。
crontab命令进程(Linux中每一个命令都是使用进程来运行的)的运行是依靠crond服务的,并可以对定时任务进行管理与访问控制。crond是Linux操作系统在安装的时候必须安装的服务之一。
crontab相关命令和用法:
1. 在config配置文件中查找(grep)是否有cron这个服务
chkconfig --list | grep cron
注意:这个命令是只在Redhat系列的Linux操作才有,ubuntu是没有的,需要用sysv-rc-conf替代。
实例:
root@Thomson:~# chkconfig --list|grep cron
anacron 2:on 3:on 4:on 5:on
cron 2:on 3:on 4:on 5:on
2. 查看crond服务状态
service crond status
3. 启动、停止、重启crond服务
service crond start/stop/restart
crontab命令的用户访问权限控制
crontab命令参数:
格式:
crontab [参数选项]
参数选项:
-e :编辑crontab定时任务
-l 查询crontab任务(cron tab)
-r :删除当前用户所有的crontab任务
注意:
1. crontab -e 是在当前用户的权限下执行的,即crontab命令绑定了当前的用户。如果不是root用户,有些权限是不能执行的,例如关机等。
2. Linux系统中脚本一般不写循环,因为容易出现死循环的问题。而crontab默认是循环的,根据时间间隔循环
例如:
crontab –e (edit) #进入crontab编辑界面。一般默认是用vim进行编辑工作
cron文件内容:
#Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
定时时间格式:
*****执行的任务
* 号的含义:
注意:
1. 是一小时中的第几分钟
例如:10 * * * * 表示1:10 、 2:10执行
2. 如果第一个写*,默认是每分钟执行一次,所以一般会写上数字来确定是一小时中的固定时间进行定时任务而不是每隔多少时间进行
每隔多少分钟执行
*/10 * * * * 每隔10分钟执行一次
一般大操作在凌晨4、5进行,据说是因为访问量最少
特殊表达式:
0 0 1,15 * 1
每个月的1号、15号和周一三种情况都会执行
注意 : 日期和周几最好不要一起使用
crontab使用注意事项:
文件路径一定要用绝对路径,因为定时任务的路径跟系统的PATH路径是不同的,如果不写绝对路径,很有可能执行不了
实验:
1. 检测定时任务是否能正常工作
1)终端输入
tltx@Thomson:~$ crontab –e
进入编辑页面
2)在编辑页面中添加
*/1 * * * * echo '123456' >> /home/tltx/test.sh
每隔一分钟在test.sh文件中写入 123456 字符串
3)查看test.sh文件
tltx@Thomson:~$ cat /home/tltx/test.sh
#! bash/bin
123456
123456
123456
123456
4)删除任务
crontab -r
5)检测是否删除成功
tltx@Thomson:~$ crontab -l
no crontab for tltx
cron文件中之前编辑的定时任务也会自动删除
系统crontab设置
可以设定用户身份
配置文件在操作系统中存放的目录:
/etc/crontab
需要注意的是,这个文件只能有root用户来编辑
以前的cetos Linux系统的crontab文件会有以下的一些配置,默认每小时,每天,每周,每月执行的任务,只要把定时任务放在/etc/cron.hourly这些文件中就可以实现系统配置的定时任务。目前crontab不再管理以下的文件,而用anacron管理
(3)anacron配置
服务器在执行定时任务的时候因为宕机等故障问题而无法执行或者系统关机错过执行的时候,anacron会在系统恢复正常的后检测cron相关文件,重新执行定时任务。虽然实际环境中,服务器宕机的可能性还是比较小的,但anacron为定时任务提供了另一层保障。
anacron只会检测cron.hourly , cron.daily , cron.weekly , cron.monthly这些文件,所以定时任务需要添加到这些文件中。
以上文件在操作系统中的存放地址:
/etc/
另外还有与定时任务执行记录相关的文件:
/var/spool/anacron/ 中同样存放着cron.{daily,weekly,monthly}文件,用于记录上次执行定时任务的时间(格式为:年月日),定时任务在执行之前会将里面存放的记录时间和当前时间做比较,如果时间差大于/etc/文件夹下cron.{daily,weekly,monthly}文件中的定时任务设定的时间,就知道有cron任务被遗漏。然后会补上执行遗漏的任务。
注意:这种检测机制只精确到了天,小时和分钟的定时任务无法检测。
关于cron.{daily,weekly,monthly}文件夹
在新版本中,就不需要检测anacron服务是否开启了,因为已经变成系统命令。
查看cron.daily文件夹文件:
# ls
cron.daily文件夹
其中0anacron.sh是最关键的一个执行文件
查看0anacron文件内容:
#cat 0anacron(无注释的为添加的定时任务)