本文主要介绍了Linux中定时任务的相关知识。


在日常中,有一些任务需要定时执行,例如:每天定时更新杀毒软件的数据库,每天定时执行数据清洗等脚本。这里就需要做定时任务。


(1)概述

在Linux中定时任务主要分为两种:一次性任务和周期性任务。

一次性任务使用的命令是at和batch;

周期性任务使用的命令是vivex和cron。


(2)一次性定时任务

①命令at

②设置定时任务:at TIME

其中后面的TIME可以用准确时间和模糊时间。

例如:

   at now+3min
   at 11:30

   at noon,midnight,teatime(下午四点)

如图,使用at now+3min,定时3分钟后的任务:

wKioL1M-VtiymTwFAAAe53ZTZh8484.jpg

如图使用at命令后会出现at的提示符,只用输入要执行的命令即可:

wKioL1M-Vzey3bbfAAAuqmkEepE007.jpg

在输入完要执行的命令后,按ctrl+D提交即可:

wKiom1M-V_vzYJ7BAAB0TT27_Sc210.jpg

执行的结果将以邮件的形式返回给任务发起者。使用mail命令可以查看邮件。

wKiom1M-WorR7NhYAAOs6Liv_UQ037.jpg

这里我有很多定时任务的邮件,只需要键入相应的编号即可查看邮件

wKiom1M-W1qi-pQFAAEajiBXh4A973.jpg

查看邮件完毕,键入q即可退出

wKiom1M-XFXgcpt-AAF2RU6vzBI060.jpg

③列出尚未执行的定时任务

at -l

wKioL1M-XOfx2LAGAABD3ehk3SU956.jpg

④删除尚未执行的定时任务

at -d #或者atrm #

wKiom1M-XZixTQBLAABZMB5TxgI572.jpg

④执行文件中的命令

at -f /PATH/TO/AT_SCRIPT TIME

例如:文本attest.txt文本如下

wKiom1M-XlCDxxBOAAAnsa2PkFo805.jpg

使用at -f指定文本文件中的命令执行时间

wKiom1M-XrmABHTnAABYhWIjA6s067.jpg

执行后结果如下:

wKioL1M-Xz3ScypEAAEVTpGkf7I735.jpg


(3)周期性定时任务

①概述

周期性定时任务常用crond来使用,这是一个daemon。常用的命令是crontab。它主要分为系统cron和用户cron。

其中系统cron在/etc/crontab中。如下图:

wKiom1M-YYigFNazAAFBAjXbHwM803.jpg

用户cron在/var/spool/cron/USERNAME中:

wKioL1M-Ya7iSL8RAABT-ghN5wk577.jpg

②crontab命令

1.运行者身份

(1)系统cron:在配置文件中指定

一共7个字段,如 3 4 * * * root cat /etc/fstab。中间用空格分隔,前面对应完后6个空格对应完后,剩下的空格统一归为最后一个字段的命令。

其中每个字段分别表示:分钟 小时 在月中的日(1-31)  月(1-12)  星期  用户  命令。

(2)用户cron: 6个字段,与系统cron相比,无需指定用户身份。

①命令crontab

   使用crontab后会出现类似文本编辑的页面,只需要编辑相应的定时命令即可。

②选项:

   -e:定义;
   -r:移除配置文件,会删除所有任务;
   -l:列出周期性任务。

   -u USERNAME:以其他用户身份定义。例如:crontab -e -u hadoop

(3)通配符:

*:相应时间点的所有有效取值

,:离散取值,  3,33 ****root date

/:定义指定取值范围内的频率,  */3 * * * *:每3分钟

-:连续取值:8-20/3  13 8-20/3 * * *


2.PATH

cron默认路径: /bin;/sbin;/usr/bin;/usr/sbin
 如果是命令:使用绝对路径

 如果是脚本:在脚本中自行定义PATH=


3.如何拒收邮件:
 方法一:
   MAILTO=''
 方法二:

   &> /dev/null


4.小例子:

 3 18 * * 2,5: 每周2和周5的18点3分
 7 2 */2 * *:每两天的2点7分

 2,32 8-18/3 * * 1-5:星期1到5的8到18点中每3个小时的2分和32分


5.以秒为单位执行任务计划

方法一:
* * * * * /usr/bin/unison webdata
* * * * * sleep 30 & /usr/bin/unison webdata

方法二:
每隔15秒:* * * * * for i in 0 1 2; do some_job && sleep 15; done; some_job

每隔10秒:* * * * * for i in {1..5}; do some_job && sleep 10; done; some_job


6.注意事项

使用%时要加反斜线。

②在RHEL5有anacron,这是对cron的补充。

他会寻找过去没执行的任务找一个合适的时间点执行。例如,用户定时每天凌晨3点更新杀毒软件库,但2点关机,因此任务不会执行。这样anacron会在下一次开机后找一个合适的时间执行。
而RHEL6cronie本身就有这个功能。