当前位置: 首页 > 科技观察

linux下如何使用cron来调度任务

时间:2023-03-14 23:37:52 科技观察

没时间运行命令?使用cron的计划任务意味着您不必熬夜运行程序。成为系统管理员的挑战之一(还有许多好处)是在您应该睡觉的时候运行一些任务。例如,某些任务(包括定期运行的任务)需要在无人使用计算机资源时运行,例如午夜或周末。下班后我没有时间运行命令或脚本。另外,我不想在晚上启动备份或主要更新。相反,我使用两个服务函数来在预定时间运行命令、程序和任务。cron和at服务允许系统管理员安排任务在未来的特定时间运行。at服务指定在特定时间运行任务。cron服务可以安排任务定期重复,例如几天、几周或几个月。在本文中,我将介绍cron服务及其使用方法。cron的常见(和不常见)用途我使用cron服务来安排常见的事情,例如每天凌晨2:00进行的定期备份,我也将它用于不太常见的事情。许多计算机上的系统时钟(例如,操作系统时间)设置为使用网络时间协议(NTP)。NTP设置系统时间后,并没有设置硬件时钟,可能会“漂移”。我使用cron根据系统时间设置硬件时钟。我还有一个每天早上运行的Bash程序,用于在每台计算机上创建新的“每日消息”(MOTD)。它包含有用的信息,例如当前的磁盘使用情况。许多系统进程和服务,如Logwatch、logrotate和RootkitHunter,每天都使用cron服务来安排任务和运行程序。crond守护进程是执行cron功能的后台服务。cron服务检查/var/spool/cron和/etc/cron.d目录中的文件,以及/etc/anacrontab文件。这些文件的内容定义了以不同时间间隔运行的cron作业。个人用户cron文件位于/var/spool/cron,而系统服务和应用程序生成的cron作业文件位于/etc/cron.d目录中。/etc/anacrontab是一个特例,本文稍后会介绍。使用crontabcron实用程序根据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#Fordetailsseeman4crontabs#Exampleofjobdefinition:#.----------------分钟(0-59)#|.------------小时(0-23)#||。----------dayofmonth(1-31)#|||。------month(1-12)ORjan,feb,mar,apr...#||||。----星期几(0-6)(星期日=0或7)或星期日、星期一、星期二、星期三、星期四、星期五、星期六#||||#*****要执行的用户名命令#backupusingthersbuprogramtotheinternal4TBHDDandthen4TBexternal0101***/usr/local/bin/rsbu-vbd1;/usr/local/bin/rsbu-vbd2#Setthehardwareclocktokepitinsyncwiththemoreaccuratesystemclock0305***/sbin/hwclock--systohc#Performmonthlyupdatesonthefirstofthemonth#25041**/usr/bin/dnf-yupdatecrontab命令用于查看或编辑cron文件。上面代码的前三行设置了默认环境。必须为给定用户设置环境变量,因为cron不以任何方式提供环境。SHELL变量指定运行命令的shell。在此示例中,指定了Bashshell。MAILTO变量设置将cron作业结果发送到的电子邮件地址。这些电子邮件提供cron作业(备份、更新等)的状态,就像您从命令行手动运行程序时看到的那样。第三行设置环境的PATH变量。但即使在此处设置了路径,我也始终为每个程序使用完全限定的路径。在上面的示例中,有几行注释详细说明了定义cron作业所需的语法。我将在下面分别解释这些命令中的每一个,然后添加crontab文件的更多高级功能。0101***/usr/local/bin/rsbu-vbd1;/usr/local/bin/rsbu-vbd2我的/etc/crontab中的这一行运行一个为我的系统执行备份的脚本。这一行运行我自己的Bashshell脚本rsbu,它对我的??系统进行完整备份。该作业每天凌晨1:01(0101)运行。三、四、五位的星号(*)代表一个特定的时间,就像文件通配符一样。它们代表“一个月中的每一天”、“每个月”和“一周中的每一天”。一行将运行我的备份两次,一次备份内部专用硬盘,另一次运行备份外部USB驱动器,所以我可以放心使用。下一行我设置了一个硬件时钟,它使用当前系统时钟作为源来设置硬件时钟。该线路设置为每天凌晨5:03运行。0305***/sbin/hwclock--systohc此行使用系统时间作为源来设置硬件时钟。我使用的第三个也是最后一个cron作业是执行dnf或yum更新,它在每个月的第一天凌晨04:25运行,但是,我将其注释掉,这样我就不会再运行了。#25041**/usr/bin/dnf-yupdate行用于执行每月更新,但是,我也将其注释掉了。其他计时技巧现在,让我们做一些比基础知识更有趣的事情。假设您想在每周四下午3:00运行一个特定的作业:行0015**Thu/usr/local/bin/mycronjob.sh将在每周四下午3:00运行mycronjob.sh脚本。或者您可能需要在每个季度末运行季度报告。cron服务没有为“每个月的最后一天”设置选项,因此替代方法是使用下个月的第一天,如下所示(假设当作业准备好运行时,数据报告所需已准备)。020311,4,7,10*/usr/local/bin/reports.sh在本季度结束后的下一个月的***日运行此cron作业。下面显示的作业在每天上午9:01到下午5:01之间每小时运行一次。0109-17***/usr/local/bin/hourlyreminder.sh有时您希望作业在工作时间内定期运行。我有一种情况,我需要一份工作每两、三或四个小时运行一次。它需要将时间除以所需的时间间隔,例如*/3每三个小时运行一次,或6-18/3从早上6点到下午6点每三个小时运行一次。其他时间间隔的划分也类似。例如,分钟位置的表达式*/15表示“每15分钟运行一次作业”。*/508-18/2***/usr/local/bin/mycronjob.sh此cron作业在上午8:00到下午18:59之间每五分钟运行一次。需要注意一点:除法表达式的结果必须有余数0(即可以整除)。换句话说,在此示例中,作业设置为在上午8:00到下午6:00之间的偶数小时内每5分钟运行一次(08:00、08:05、08:10、08:15...18:55等)而不是在奇数时间运行。此外,此作业不能在晚上7:00到早上7:59之间运行。(LCTT译注:本文此处表述有误,根据正确情况修改)相信大家可以根据这些例子想到很多其他的可能。限制对cron的访问普通用户可能会在使用cron访问时出错,例如,这可能会导致系统资源(如内存和CPU时间)耗尽。为避免这种可能出现的问题,系统管理员可以通过创建/etc/cron.allow文件来限制用户访问,该文件包含允许创建cron作业的用户列表。(无论是否在此列表中)都不会阻止root用户使用cron。通过阻止非root用户创建他们自己的cron作业,可能需要将非root用户的cron作业添加到root的crontab,“但是等等!”你说,“这些作业不是以root身份运行的吗?”不必。在本文的第一个示例中,注释中出现的用户名字段可用于指定运行作业的用户ID。这可以防止某些非root作业以root身份运行。以下示例显示了以“student”用户身份运行作业的作业定义:0407***student/usr/local/bin/mycronjob.sh如果未指定用户,则作业将以contab文件的所有者身份运行运行,在本例中为root。在cron.d目录/etc/cron.d中是SpamAssassin和sysstat等应用程序安装的cron文件。由于没有spamassassin或sysstat用户,这些程序需要一个地方来放置cron文件,所以它们被放置在/etc/cron.d中。下面的/etc/cron.d/sysstat文件包含与系统活动报告(SAR)相关的cron作业。这些cron文件与用户cron文件具有相同的格式。#Runsystemactivityaccountingtoolevery10minutes*/10****root/usr/lib64/sa/sa111#Generateadailysummaryofprocessaccountingat2??3:535323***root/usr/lib64/sa/sa2-Asysstat包安装/etc/cron.d/sysstatcron文件运行生成SAR的程序。sysstatcron文件有两行执行任务。***行每十分钟运行一次sa1程序来收集数据,这些数据存储在/var/log/sa目录下的一个指定的二进制文件中。然后,每天晚上23:53,sa2程序运行以创建每日摘要。调度技巧我在crontab文件中设置的某些时间可能看起来是随机的,但在某种程度上,它们确实是随机的。尝试安排cron作业可能具有挑战性,尤其是随着作业数量的增长。我的每台计算机上通常只有几个任务,这比我使用的生产和实验室计算机要简单得多。我管理的一个系统有12个每晚运行cron作业,还有3或4个在周末或月初运行。这是一个真正的挑战,因为如果同时运行的作业太多,尤其是备份和编译系统,它可能会耗尽内存并几乎填满交换文件空间,这可能导致系统降级甚至过载,并且最终会发生一些事情无法完成。我增加了一些内存并改进了任务的安排方式。我还删除了一些写得不好并且占用大量内存的任务。crond服务假定主机每天24小时运行。这意味着如果计算机在预定运行期间关闭,则这些预定任务将不会运行,直到它们被预定运行的下一次。如果这里有关键的cron作业,这可能会导致问题。幸运的是,有一种替代方法可以定期运行作业:anacron。anacronanacron程序执行与cron相同的功能,但它增加了运行被跳过的作业的能力,例如,如果计算机关闭或无法在一个或多个周期内运行作业。它对于关闭或进入睡眠模式的笔记本电脑或其他计算机很有用。一旦计算机打开并成功启动,anacron就会检查过去是否遗漏了任何计划的作业。如果有,这些作业将立即运行,但是只会运行一次(无论它错过了多少循环运行)。例如,如果每周运行的作业由于休假和系统关闭而在过去三周内没有运行,它会在您的计算机启动后立即运行,但只会运行一次,而不是三次。anacron程序提供了一些选项,可以很好地处理重复的cron作业。它是一个安装在/etc/cron.[hourly|daily|weekly|monthly]目录中的脚本。根据需要经常运行。它是如何工作的?接下来的比前面的要简单一些。1.crond服务每小时运行/etc/cron.d/0中指定的cron作业。#RunthehourlyjobsSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root01****rootrun-parts/etc/cron.hourly/etc/cron.d/0hourly一个shell脚本位于在/etc/cron.hourly运行。2./etc/cron.d/0hourly中指定的cron作业每小时运行一次run-parts程序。3、run-parts程序运行/etc/cron.hourly目录下的所有脚本。4./etc/cron.hourly目录中包含的0anacron脚本使用以下/etdc/anacrontab配置文件来运行anacron程序。#/etc/anacrontab:配置文件foranacron#Seeanacron(8)andanacrontab(5)fordetails.SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root#themaximalrandomdelayaddedtothebasedelayofthejobsRANDOM_DELAY=45#thejobsANswillbestartedduringthefollowing-22#periodindaysdelayinminutesjob-identifiercommand15cron.dailynicerun-parts/etc/cron.daily725cron.weeklynicerun-parts/etc/cron.weekly@monthly45cron.monthlynicerun-parts/etc/cron.monthly/etc/anacrontab文件在适当的时间运行的可执行文件cron.[每日|每周|每月]目录。5.anacron程序每天运行一次位于/etc/cron.daily中的作业。它每周运行一次位于/etc/cron.weekly中的作业。并每月在cron.monthly中运行一次作业。请注意每行指定的延迟时间,这有助于避免这些作业与其他cron作业重叠。我将它们放在/usr/local/bin目录中,而不是将完整的Bash程序放在cron.X目录中,这使我更容易从命令行运行它们。然后,我在cron目录中添加一个符号链接,例如/etc/cron.daily。anacron程序并非设计为在指定时间运行程序。相反,它用于在指定时间启动并以特定时间间隔运行程序,例如,从每天凌晨3:00开始(请参阅上面脚本中的START_HOURS_RANGE行),从星期日(*星期几))和该月的第一天。如果错过任何一个或多个周期,anacron将立即运行错过的作业。关于设置限制的更多信息我使用很多方法在我的计算机上运行计划任务。所有这些任务都需要root权限才能运行。根据我的经验,很少有普通用户需要运行cron作业,一种情况是开发人员需要cron作业来开始每天编译开发实验室。限制非root用户访问cron功能非常重要。但是,在某些特殊情况下,用户需要设置一个任务在预先指定的时间运行,而cron可以让他们这样做。许多用户不了解如何正确配置cron来完成他们的工作,并且他们会犯错误。这些错误可能是无害的,但往往会导致问题。通过设置功能策略并在用户和管理员之间进行协作,可以使单个cron作业尽可能少地干扰其他用户和系统功能。可以对分配给单个用户或组的资源设置限制,但是,那是下一篇文章的内容。有关详细信息,请参阅cron、crontab、anacron、anacrontab和run-parts的手册页,所有这些都描述了cron系统的工作原理。