服务器
没有时间运行命令?使用 cron 的计划任务意味着你不用熬夜程序也可以运行。
系统管理员(在许多好处中)的挑战之一是在你该睡觉的时候去运行一些任务。例如,一些任务(包括定期循环运行的任务)需要在没有人使用计算机资源的时候去运行,如午夜或周末。在下班后,我没有时间去运行命令或脚本。而且,我也不想在晚上去启动备份或重大更新。
取而代之的是,我使用两个服务功能在我预定的时间去运行命令、程序和任务。cron 和 at 服务允许系统管理员去安排任务运行在未来的某个特定时间。at 服务指定在某个时间去运行一次任务。cron 服务可以安排任务在一个周期上重复,比如天、周、或月。
在这篇文章中,我将介绍 cron 服务和怎么去使用它。
常见(和非常见)的 cron 用途
我使用 cron 服务去安排一些常见的事情,比如,每天凌晨 2:00 发生的定期备份,我也使用它去做一些不常见的事情。
许多电脑上的系统时钟(比如,操作系统时间)都设置为使用网络时间协议(ntp)。 ntp 设置系统时间后,它不会去设置硬件时钟,它可能会“漂移”。我使用 cron 基于系统时间去设置硬件时钟。
我还有一个 bash 程序,我在每天早晨运行它,去在每台电脑上创建一个新的 “每日信息” (motd)。它包含的信息有当前的磁盘使用情况等有用的信息。
许多系统进程和服务,像 logwatch、logrotate、和 rootkit hunter,使用 cron 服务去安排任务和每天运行程序。
crond 守护进程是一个完成 cron 功能的后台服务。
cron 服务检查在 /var/spool/cron 和 /etc/cron.d 目录中的文件,以及 /etc/anacrontab 文件。这些文件的内容定义了以不同的时间间隔运行的 cron 作业。个体用户的 cron 文件是位于 /var/spool/cron,而系统服务和应用生成的 cron 作业文件放在 /etc/cron.d 目录中。/etc/anacrontab 是一个特殊的情况,它将在本文中稍后部分介绍。
使用 crontab
cron 实用程序运行基于一个 cron 表(crontab)中指定的命令。每个用户,包括 root,都有一个 cron 文件。这些文件缺省是不存在的。但可以使用 crontab -e 命令创建在 /var/spool/cron 目录中,也可以使用该命令去编辑一个 cron 文件(看下面的脚本)。我强烈建议你,不要使用标准的编辑器(比如,vi、vim、emacs、nano、或者任何其它可用的编辑器)。使用 crontab 命令不仅允许你去编辑命令,也可以在你保存并退出编辑器时,重启动 crond 守护进程。crontab 命令使用 vi 作为它的底层编辑器,因为 vi 是预装的(至少在大多数的基本安装中是预装的)。
现在,cron 文件是空的,所以必须从头添加命令。 我增加下面示例中定义的作业到我的 cron 文件中,这是一个快速指南,以便我知道命令中的各个部分的意思是什么,你可以自由拷贝它,供你自己使用。
# crontab -eshell=/bin/bashmailto=root@example.compath=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin# 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# backup using the rsbu program to the internal 4tb hdd and then 4tb external01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2# set the hardware clock to keep it in sync with the more accurate system clock03 05 * * * /sbin/hwclock --systohc# perform monthly updates on the first of the month# 25 04 1 * * /usr/bin/dnf -y updatecrontab 命令用于查看或编辑 cron 文件。
上面代码中的前三行设置了一个缺省环境。对于给定用户,环境变量必须是设置的,因为,cron 不提供任何方式的环境。shell 变量指定命令运行使用的 shell。这个示例中,指定为 bash shell。mailto 变量设置发送 cron 作业结果的电子邮件地址。这些电子邮件提供了 cron 作业(备份、更新、等等)的状态,和你从命令行中手动运行程序时看到的结果是一样的。第三行为环境设置了 path 变量。但即使在这里设置了路径,我总是使用每个程序的完全限定路径。
在上面的示例中有几个注释行,它详细说明了定义一个 cron 作业所要求的语法。我将在下面分别讲解这些命令,然后,增加更多的 crontab 文件的高级特性。
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2在我的 /etc/crontab 中的这一行运行一个脚本,用于为我的系统执行备份。
这一行运行我自己编写的 bash shell 脚本 rsbu,它对我的系统做完全备份。这个作业每天的凌晨 1:01 (01 01) 运行。在这三、四、五位置上的星号(*),像文件通配符一样代表一个特定的时间,它们代表 “一个月中的每天”、“每个月” 和 “一周中的每天”,这一行会运行我的备份两次,一次备份内部专用的硬盘驱动器,另外一次运行是备份外部的 usb 驱动器,使用它这样我可以很保险。
接下来的行我设置了一个硬件时钟,它使用当前系统时钟作为源去设置硬件时钟。这一行设置为每天凌晨 5:03 分运行。
03 05 * * * /sbin/hwclock --systohc这一行使用系统时间作为源来设置硬件时钟。
我使用的第三个也是最后一个的 cron 作业是去执行一个 dnf 或 yum 更新,它在每个月的第一天的凌晨 04:25 运行,但是,我注释掉了它,以后不再运行。
# 25 04 1 * * /usr/bin/dnf -y update这一行用于执行一个每月更新,但是,我也把它注释掉了。
其它的定时任务技巧
现在,让我们去做一些比基本知识更有趣的事情。假设你希望在每周四下午 3:00 去运行一个特别的作业:
00 15 * * thu /usr/local/bin/mycronjob.sh上面这一行会在每周四下午 3:00 运行 mycronjob.sh 这个脚本。
或者,或许你需要在每个季度末去运行一个季度报告。cron 服务没有为 “每个月的最后一天” 设置选项,因此,替代方式是使用下一个月的第一天,像如下所示(这里假设当作业准备运行时,报告所需要的数据已经准备好了)。
02 03 1 1,4,7,10 * /usr/local/bin/reports.sh在季度末的下一个月的第一天运行这个 cron 作业。
下面展示的这个作业,在每天的上午 9:01 到下午 5:01 之间,每小时运行一次。
01 09-17 * * * /usr/local/bin/hourlyreminder.sh有时,你希望作业在业务期间定时运行。
我遇到一个情况,需要作业在每二、三或四小时去运行。它需要用期望的间隔去划分小时,比如, */3 为每三个小时,或者 6-18/3 为上午 6 点到下午 6 点每三个小时运行一次。其它的时间间隔的划分也是类似的。例如,在分钟位置的表达式 */15 意思是 “每 15 分钟运行一次作业”。
*/5 08-18/2 * * * /usr/local/bin/mycronjob.sh这个 cron 作业在上午 8:00 到下午 18:59 之间,每五分钟运行一次作业。
需要注意的一件事情是:除法表达式的结果必须是余数为 0(即整除)。换句话说,在这个例子中,这个作业被设置为在上午 8 点到下午 6 点之间的偶数小时每 5 分钟运行一次(08:00、08:05、 08:10、 08:15……18:55 等等),而不运行在奇数小时。另外,这个作业不能运行在下午 7:00 到上午 7:59 之间。(lctt 译注:此处本文表述有误,根据正确情况修改)
我相信,你可以根据这些例子想到许多
小品牌入驻天猫真的很难吗?云服务器数据安全吗网站突然不能浏览-虚拟主机/数据库问题阿里云服务器怎么扩容内存中小企业网站做SEO优化需要注意哪些方面云蚁物联服务器在哪买.com域名:中小企业触达世界的第一步\"阿里云开年采购季高配服务器划算