如何使用Cron和Crontab在Linux中计划任务

您知道 Blade Runner 是在2019年设定的吗?从现在开始三年了!更不用说回到未来2 了,他们在时间上追溯到2015年。但是,我们没有飞行的汽车,而且据我们所知,我们之间没有复制品。当我们将其与对未来的虚构描述进行比较时,很容易对当前技术感到失望。不过,这些天来,我们的电话,计算机甚至房屋都可以做令人惊奇的事情。自动化任务的能力就是其中之一。

每个Linux用户都可以从计划任务中受益,无论它们是否与系统相关(例如,清理旧日志并从Windows 95开始更新软件包)。在Linux上,相同的工作称为cron,在这里我们将解释如何使用它。

什么是Cron?

Cron是在后台运行的系统服务,请检查一下任务(也称为“ cron作业")在特殊的配置文件(crontabs)中定义,cron每分钟扫描一次。在不同的Linux发行版中可以找到多个版本的cron。例如,Fedora的cron分支称为cronie,还有fcron,bcron和dcron,其中一些具有额外的功能,而其他一些则更多地关注安全性,但是它们都基于相同的思想。

本指南是为vixie-cron编写的,它是cron的最广泛版本,也是您将要使用的版本。在Ubuntu及其衍生产品上找到。虽然大多数说明也适用于其他cron实现,但是可能会有细微差别,因此,如果您决定切换,请查看其手册。

什么是Crontab?

如果您是认真的人关于管理您的时间,您可能拥有某种日历-一个应用程序或至少一张纸。 Crontab非常类似于您计算机的日历。它包含有关计划任务的信息,告诉cron在什么时间运行哪些命令。

实际上,您的系统上有几个crontab。每个用户都有自己的crontab,包括root(管理员)。用户crontab存储在 / var / spool / cron / crontabs / 中。 crontab -l <​​/ code>命令将列出当前用户的crontab文件。您可以使用 sudo crontab -l <​​/ code>检查根目录crontab。

此外,还有用于系统的系统crontab文件 / etc / crontab 。广泛的任务。通常,它们采取可执行的,root拥有的脚本的形式,放置在 /etc/cron.hourly / /etc/cron.daily / / etc中/cron.weekly / /etc/cron.monthly / 文件夹,在某些发行版中,还包含 /etc/cron.d / 文件夹。一般来说,您不必处理这些任务,因为大多数任务是由已安装的应用程序自动创建的。

如何使用Cron计划任务

听起来很简单:安排任务,只需将它们添加到您的crontab中。由于crontab是一个特殊的配置文件,因此不建议手动对其进行编辑。而是使用 crontab -e 命令。要编辑root或其他用户的crontab,请以管理特权运行命令,并在-u选项后添加其用户名:

sudo crontab -u root -e
sudo crontab -u用户名-e

crontab文件有两个部分。第一个包含自动设置的环境变量。您可以安全地更改PATH,HOME和SHELL变量,并修改MAIL变量。

文件的第二部分是计划任务的实际“时间表"。每个任务在表中占一行(行),各列表示以下值:

要成功计划任务,您需要了解一些crontab语法:

  • 数字应为整数(整数),您可以在任何列中使用星号(*)作为通配符,表示“每分钟/每天/每月……"。
  • 在“日"中月份"列,请注意不要设置“月份"列中指定的月份(例如2月30日)中没有出现的日期。
  • “月份"和“日期" “星期几"列分别接受几个月和几天的简称,并且不区分大小写。
  • 在“星期几"列中,0和7代表星期日。 “小时"列要求使用“军事时间"(24小时)格式,但是您不能使用数字24,而是0代表上午12点,这是因为分钟,小时和星期几的值始于0而不是1。
  • 不支持秒,因此您不能在特定的时间安排任务。
  • 您可以做的是使用连字符( “小时"下的14-22将从下午2点到晚上10点连续运行任务),或者通过定义以逗号分隔的列表多次运行单个任务(“星期几"下的1,3,5将运行任务

    同时,步长值用正斜杠(/)表示,它们表示一个范围内的跳过量。例如,“小时"下的3-20 / 3将从凌晨3点到下午8点每三小时运行一次任务。当您想每X个小时重复一次任务时,此功能很有用,因为您可以将星号和步骤(* / X)组合在一起。只要您使用数字,就可以将范围与列表结合起来,将步与范围结合起来。换句话说,不允许使用“ jan-mar"或“ Tue,Fri-Sun"之类的组合。

    或者,除了为每个列设置值之外,您还可以只写@ weekly,@ yearly ,@ monthly,@ daily或@hourly在一行的开头,然后是命令。如此安排,任务将在第一个可能的实例上运行,因此@weekly将在一周的第一天午夜运行。如果要在系统重新启动时立即运行任务,请使用@reboot命令。

    在此示例中,我们计划每天在08:20和20:20进行备份。墙纸每三天在19:00自动更改一次,并且脚本将在每个星期一10:20和20:20检查新的播客。生日提醒设置为3月25日,每30分钟在指定的时间范围内运行一次。最后,脚本会每15分钟从8点到20点(仅在工作日)检查一次电子邮件。您可以自由地在列之间使用空格和制表符来组织crontab,但不要在列中使用空格和制表符(不要在逗号,连字符和斜杠之间放置空格)。

    如果这听起来太复杂,请不要不必担心-您可以始终依靠互联网。诸如Crontab Generator,Crontab.guru和Corntab之类的工具可帮助您创建cron作业,而无需了解任何crontab语法。它们向您显示下一步何时执行作业,并提供常用表达式的模板。 Crontab.guru是同类产品中最好的,因为它可以对crontab语法进行实时测试,因此您可以立即查看所做的更改将如何影响计划。

    如何检查Cron作业是否已执行

    Cron应该在后台安静运行,并且在您处理任务的同时让您不受干扰地工作。但是,如何确定它确实有效?

    Cron has an in-built email notification feature, but this requires setting up at least a simple local mail server . Not many home users are willing to configure this, and not many distributions provide it by default (for instance, Ubuntu doesn’t). The fastest way to check up on cron is to scan the system log with this command:

    cat / var / log / syslog | grep -i cron

    -i选项使查询不区分大小写。 cron可能会在 / var / log / 中的某个位置拥有自己的日志文件,因此请查看该命令是否无法产生有用的结果。

    如果需要保存特定cron作业的输出,您可以将其重定向到文件。在您要运行的命令后,在crontab的最后一栏中提供文件的路径和名称:

    30 * * * * / usr / bin /您的命令> / home / username / logfile.txt

    使用单个>符号将在每次运行命令时覆盖文件。为了避免这种情况,请使用>>代替-将输出附加到现有文件中。

    如果Cron无法正常工作怎么办?

    添加了一些任务可能会发生,检查了系统日志,发现它们没有按预期执行。尝试解决此问题时,您应该考虑以下几点,并且要小心。

    您知道,cron守护程序应该在后台运行。确保确实如此。该服务称为crond或cron。

    对于使用systemd的发行版:

    systemctl status cron

    对于使用Upstart的发行版:

    服务计划状态

    如果您的发行版使用的是“旧的" System V init方法,请列出所有具有以下服务的服务:

    initctl list

    ,看看是否列出了cron。

    检查您的 / etc 文件夹中是否有名为的文件cron.allow cron.deny 。在Ubuntu上,两者都不应该存在,这意味着所有用户都可以管理cron作业。但是,如果有一个 cron.allow 文件,则该文件必须包含您的用户名。相反,如果 cron.deny 文件存在,则您的用户名不应在其中。将 cron.deny 文件保留为空意味着只有root和 cron.allow 中列出的用户可以拥有crontab文件。

    Crontab自动设置您的SHELL变量到 / bin / sh 。但是,如果选择的外壳是鱼或bash,则应更改SHELL变量。同样,默认情况下,PATH变量仅包含几个目录。这是crontab寻找Linux命令的地方。如果您的cron作业无法运行,则可能是因为crontab没有“看到"您所使用的命令。为避免这种情况,请将包含命令的目录添加到以冒号分隔的PATH变量中:

    PATH=/opt/myapp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

    如果不想在crontab中进行编辑,则可以在脚本中定义这些变量。

    Crontab语法并非一帆风顺。即使您使用前面提到的在线工具进行了验证,微小的错误仍然可能阻止cron执行您的工作。请注意:

  • 在crontab文件的末尾添加一个空行
  • 如果命令中包含%符号,请在其后面加上反斜杠
  • 写注释以#开头的单独行。不要在环境变量的同一行或cron作业命令旁边写注释。
  • 您真的必须使用终端吗?

    绝对不需要。 KDE用户可以使用KCron计划cron作业,可通过系统设置>任务计划程序模块进行访问。凭借简单易用的界面,您只需单击几下鼠标即可选择和调整所有内容,因此KCron很高兴使用。

    如果您喜欢GNOME,那么GNOME Schedule非常适合您。该方法是相似的,尽管预期界面略有不同。它提供了用于细粒度修改的高级模式,并带有一个面板小程序,您可以从中直接管理任务。

    您应该了解其他解决方案,例如Crontab-UI和Minicron。它们更适合于管理多台机器和cron作业的用户,其最酷的功能之一是基于Web的界面。

    有Cron替代品吗?

    While cron is pretty much the standard task scheduler for Linux , it certainly isn’t the only one. The at command is perfect for quick, one-time jobs that can be scheduled right from the command-line, without special configuration files. If you need more, there is GNUbatch, which introduces the notion of dependency. With GNUbatch, you can set specific conditions for every job, or make a scheduled task depend on a previous one. Something similar can be achieved with systemd timers. Although less practical to configure than cron, systemd timers can remember if a task missed its schedule while the computer was off, and run it the next time it’s on.

    这是cron不能独自完成的事情。因此,它适用于持续运行的服务器和计算机,但不会执行计算机关闭时安排的作业。这是anacron起作用的地方。从技术上讲,它不是cron的“替代品"或替代品。相反,anacron是cron的补充,应与cron一起使用,在许多Linux发行版中(包括Ubuntu和基于Ubuntu的产品)就是这种情况。 Anacron记录上一次执行任务的时间,并在系统关闭电源时检查是否有任何丢失的实例。当您重新打开计算机电源时,它将运行它们,但每个任务每天只能执行一次。

    某些版本的cron(例如fcron)默认提供anacron的功能。高级用户可能希望查看Hcron或SuperCron,它们对cron的基本功能进行了许多改进,但在管理方面也有些挑战。

    您呢?您如何组织数字任务?您计划在Linux上执行哪些任务?在评论中分享您使用cron的故事和技巧。

    标签: