计划任务的方式可以有两种:
- 一种是 例行性 的,即每隔一定周期要办的事项
- 一种是 突发性 的,即做完之后就没的事项
在 Linux 中实现这两个功能就要使用到 at
和 crontab
这两个命令:
at
:at
是个可以处理仅执行一次就结束的命令,不过要执行at
时,必须要有atd
这个服务的支持才行crontab
:crontab
这个命令所设置的任务将会循环地一直执行下去,crontab
除了可以使用命令执行外,亦可以编辑/etc/crontab
来支持,而至于让crontab
可以生效则是crond
1 仅执行一次的计划任务
1.1 atd
的启动与 at
运行的方式
要使用单一计划任务时,Linux 必须要有负责这类计划任务的服务,那就是 atd
服务。使用
yum -y install at
然后手动启动它:
systemctl restart atd # 重新启动 atd 这个服务
systemctl enable atd # 让这个服务开机就启动
systemctl status atd # 查看 atd 目前的状态
1.2 at
的运行方式
使用 at
这个命令来产生所要运行的任务,并将这个任务以文本文件的方式写入 /var/spool/at/
这个目录内,该任务便能等待 atd
这个任务的使用与执行了。
at
命令的语法:
at [-mldv] time
选项与参数:
-m
:当at
的任务完成后,即使没有输出信息,也发 email 通知使用者该任务已经完成-l
:at -l
相当于atq
,列出目前系统上面的所有该使用者的at
计划-d
:at -d
相当于atrm
,可以取消一个在at
计划中的任务-v
:可以使用较明显的时间格式列出at
计划中的任务列表-c
:紧接任务号码,可以列出后面接的该项任务的实际命令内容time
:时间格式,定义执行at
命令的时间,格式有:HH:MM
HH:MM YYYY-MM-DD
HH:MM[am|pm] [Month] [Date]
HH:MM[am|pm] + number [minutes|hours|days|weeks]
:如now + 5 minutees
,5分钟后执行
如使用 at
命令在5分钟之后发送 /root/.bashrc
到自己的邮箱:
[admin@localhost ~]$ at now + 5 minutes
at> /bin/mail -s "testing" admin < /root/.bashrc
at> <EOT> # 输入 [ctrl] + d
注意:
- 使用
at
时进入at shell
的环境来让用户执行任务命令,所以最好就是使用 绝对路径 来执行命令,因为at
在运行的时候,会跑到当前执行at
命令的那个工作目录中执行。 - 因为
at
的执行与终端环境无关,其所有的标准输出、标准错误输出都会发送到执行者的 mailbox 中,所以比如执行要在at
中执行echo
命令,在终端也就看不到任何信息,此时可以改变数据流实现,如echo "Hello" > /dev/tty1
at
任务独立出bash
环境,直接交给系统的atd
程序来接管,所以当执行at
的任务之后就可以立刻脱机,剩下的工作就完全交给 Linux 管理。
1.3 batch
如果想要指定任务在系统比较闲的时候才执行,此时就可以使用 batch
命令,而 batch
命令其实就是利用 at
来执行命令的,它当CPU的任务负载小于 0.8
的时候,才执行你的工作任务,使用 batch
的语法与使用 at
的类似。
任务负载的意思是:CPU 在单一时间点所负责的任务数量,而不是CPU的使用率,如有一个程序需要一直使用 CPU 的运算功能,此时 CPU 的使用率可能达到
100%
,当它的任务负载只是趋近于1
,如果有两个程序同时运行,此时任务负载就变成2
2 循环执行的计划任务
循环执行的计划任务是由 cron
这个系统服务来控制的。这个系统任务是默认启动的。
2.1 用户的设置
我们可以限制 crontab
的用户账号,可以使用的配置文件有(at
命令也有):
/etc/cron.allow
:将可以使用crontab
命令的用户账号写入其中,该文件作用优先于/etc/cron.deny
文件/etc/cron.deny
:将不可使用crontab
命令的用户账号写入其中
当用户使用 crontab
命令建立计划任务之后,该项任务就会被记录到 /var/spool/cron
当中,而且是以账号作为判断依据,举例,admin
用户使用了 crontab
后,它的任务就会被记录到 /var/spool/cron/admin
中,crontab
的语法如下:
crontab [-u username] [-l|-e|-r]
选项与参数:
-u
:即帮其他使用者建立、删除crontab
计划任务,只有 root 才能执行该任务。-e
:编辑crontab
的任务内容-l
:查看crontab
的任务内容-r
:删除所有的crontab
的任务内容
当用户输入 crontab -e
命令时,就会进入到 vim 的编辑界面,然后以一行一个任务来编辑,而每项任务的格式都具有六个字段,它们的意义分别为:
- 分钟:
0~59
- 小时:
0~23
- 日期:
1~31
- 月份:
1~12
- 周:
0~7
,其中0
和7
都表示星期天的意思 - 命令:需要执行的命令
同时,还有下面这些特殊字符:
*
:表示任何时刻都接受的意思,
:代表分隔时段的意思,如0 3,6 * * * command
,就表示执行的任务时间点在3:00
和6:00
-
:代表一段时间范围内,如20 8-12 * * * command
,8点到12点之间的每个小时的20分钟执行/n
:n
代表数字,即每隔n
个单位间隔,如*/5 * * * * command
,每5分钟执行一次
2.2 系统的配置文件
一般来讲:
- 个人化的操作使用
crontab -e
,这样能够保障命令操作不被看到(/etc/crontab
文件谁都能看到) - 系统维护管理和固定每小时、每日、每周执行的特别任务都应该使用
vim /etc/crontab
放置到crontab
中集中管理较好。 - 自身开发的软件如果最好就是使用
vim /etc/cron.d/newFile
,使用全新的配置文件,并且放置到/etc/cron.d/
目录内即可
/etc/crontab
是一个纯文本文件,可以使用 root
的身份编辑该文件,基本上,cron
这个服务的最低检测限制是分钟,所以 cron
会每分钟去读取一次 /etc/crontab
与 /etc/cron.d/
里面的数据内容。
/ect/crontab
文件的内容其实与使用 crontab -e
时输入的内容大致一样,多出了以下几个地方:
MAILTO=root
:将标准输出,标注错误输出的信息发送到某个用户的邮箱,默认就是发送到 root 用户PATH=...
:执行文件路径
3 可唤醒停机期间的工作任务
如果服务器有个任务是定期循环执行的,但不巧的是当时间段服务器发生了一些状况比如停电之类的,导致该循环任务无法执行,此时就需要依靠 anacron
这个命令了,该命令可以主动帮助执行时间到了但却没有执行的任务。
3.1 anacron
anacron
的目的就是处理非24小时运行的 Linux 系统所执行的 crontab
,以及因为某些原因导致的超过时间而没有被执行的任务。anacron
实际是一个程序,这个程序在 CentOS 当中已经进入 crontab
的任务列表,从而每小时就会执行一次,以下列出工作流程来了解一下 anacron
与 crond
的关系:
- 1、
crond
会主动读取/etc/crontab
、/var/spool/cron/*
、/etc/cron.d/*
等配置文件,并根据其时间的设定去配置各项计划任务 - 2、根据
/etc/cron.d/0hourly
的设置,会主动去/etc/cron.hourly/
目录下,执行所有在该目录下的执行文件 - 3、其中
/etc/cron.hourly/0anacron
会主动每小时执行anacron
,并调用/etc/anacrontab
的配置文件 - 4、根据
/etc/anacrontab
的配置,根据每天、每周、每月分析/etc/cron.daily/
、/etc/cron.weekly/
、/ect/cron.monthly/
内的执行文件,以执行固定周期需要执行但没能执行的命令
也就是说,如果你每周日需要执行的操作是放置在 /ect/crontab
的话,那么该操作只要过期了就不会重新执行,但假如放置在 /ect/cron.weekly/
目录下,那么就一定会执行,比如关机一周再开机,那么在开机后的数小时内任务就会被主动执行。