cron linux

本文最初发布于2017年11月,现已更新以包含其他信息。

成为系统管理员的挑战(其中有很多优点)之一是当您想睡觉时正在运行任务。 例如,某些任务(包括定期重复执行的任务)需要在没有人使用计算机资源的情况下通宵运行或在周末运行。 我没有时间在晚上空闲时间运行必须在下班时间运行的命令和脚本。 而且我也不想起床太黑了以开始备份或重大更新。

取而代之的是,我使用两个服务实用程序,它们使我可以在预定时间运行命令,程序和任务。 通过cronat服务,系统管理员可以计划任务在将来的特定时间运行。 at服务指定在特定时间运行的一次性任务。 Cron服务可以重复地计划任务,例如每天,每周或每月。

在本文中,我将介绍cron服务及其使用方法。

cron的常见(和不常见)用途

我使用cron服务来计划明显的事情,例如每天凌晨2点进行的定期备份,我也将它用于不太明显的事情。

  • 我的许多计算机上的系统时间(即操作系统时间)是使用网络时间协议(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中 ,并且系统服务和应用程序通常在/etc/cron.d目录中添加cron作业文件。 / 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 -e
SHELL = / bin / bash
MAILTO =root @ example.com
PATH = / 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 external
01 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 clock
03 05 * * * / sbin / hwclock --systohc

# Perform monthly updates on the first of the month
# 25 04 1 * * /usr/bin/dnf -y update


crontab命令用于查看或编辑cron文件。

上面代码中的前三行设置了默认环境。 必须将环境设置为给定用户所需的任何值,因为cron不提供任何类型的环境。 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)运行。

 03 05 * * * / sbin / hwclock --systohc 

该行使用系统时间作为源设置硬件时钟。

我在每月的第一天凌晨04:25使用第三项也是最后一项cron作业(已注释)执行dnfyum更新,但是我对其进行了注释,因此它不再运行。

 #  25 04 1 * * / usr / bin / dnf -y update 

该行过去每月执行一次更新,但我已将其注释掉。

其他调度技巧

现在,让我们做一些比这些基础知识有趣的事情。 假设您想在每个星期四下午3点执行特定工作:

 00 15 * * Thu / usr / local / bin / mycronjob.sh 

该行每星期四下午3点运行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小时* / 3 ,或在上午6点至下午6点之间每3小时运行6-18 / 3 ,则可以类似地划分其他时间间隔; 例如,分钟位置的* / 15表示“每15分钟运行一次作业”。

 */ 5 08- 18 / 2 * * * / usr / local / bin / mycronjob.sh 

此Cron作业在上午8点至下午5:58之间的每小时中每五分钟运行一次

需要注意的一件事:除表达式必须导致零余数才能运行作业。 因此,在此示例中,作业设置为在上午8点至下午6点之间的偶数小时内每五分钟运行一次(08:05、08:10、08:15等),而不是在任何奇数时段编号小时。 例如,该作业从晚上9点至上午9:59根本不会运行

我相信您可以根据这些示例提出其他许多可能性。

限制cron访问

/etc/cron.allow文件,其中包含所有有权创建cron作业的用户的列表。 无法阻止root用户使用cron。

通过阻止非root用户创建自己的cron作业,root可能有必要将其cron作业添加到root crontab中。 “可是等等!” 你说。 “不是以root用户身份运行那些作业吗?” 不必要。 在本文的第一个示例中,注释中显示的用户名字段可用于指定作业运行时要拥有的用户ID。 这样可以防止指定的非root用户的作业作为root运行。 以下示例显示了以用户“ student”的身份运行作业的作业定义:

 04 07 * * * student / usr / local / bin / mycronjob.sh 

如果未指定用户,则以拥有crontab文件的用户(在这种情况下为root)的身份运行作业。

cron.d

目录/etc/cron.d是一些应用程序(例如SpamAssassin和sysstat )安装cron文件的位置。 由于没有spamassassin或sysstat用户,因此这些程序需要放置cron文件的位置,因此将它们放在/etc/cron.d中

下面的/etc/cron.d/sysstat文件包含与系统活动报告(SAR)相关的cron作业。 这些cron文件的格式与用户cron文件的格式相同。

# Run system activity accounting tool every 10 minutes
*/ 10 * * * * root / usr / lib64 / sa / sa1 1 1
# Generate a daily summary of process accounting at 23:53
53 23 * * * root / usr / lib64 / sa / sa2 -A

sysstat软件包安装/etc/cron.d/sysstat cron文件以运行SAR程序。

sysstat cron文件包含执行任务的两行。 第一行每10分钟运行一次sa1程序,以收集存储在/ var / log / sa目录中的特殊二进制文件中的数据。 然后,每天晚上23:53运行sa2程序以创建每日摘要。

计划提示

我在crontab文件中设置的某些时间似乎是随机的,并且在某种程度上是随机的。 尝试安排cron作业可能具有挑战性,尤其是随着作业数量的增加。 通常,我在每台计算机上仅计划几个任务,这比在我工作过的某些生产和实验室环境中要简单。

我管理的一个系统每天晚上运行大约12个cron作业,而在周末或每月的第一天又运行三个或四个。 这是一个挑战,因为如果同时运行太多作业(尤其是备份和编译),则系统将耗尽RAM并几乎填满交换文件,这会在性能下降时导致系统崩溃,因此什么也没做。 我们增加了内存,并改进了计划任务的方式。 我们还删除了一个写得很差并且使用大量内存的任务。

crond服务假定主机一直在运行。 这意味着,如果在计划运行cron作业的期间关闭了计算机,则只有在下次计划它们时,计算机才会运行。 如果它们是重要的cron作业,则可能会导致问题。 幸运的是,还有另一种用于定期运行作业的选项: anacron

Python

anacron程序执行与crond相同的功能,但是它增加了运行被跳过的作业的功能,例如计算机关闭或无法在一个或多个周期内运行该作业。 这对于关闭或进入睡眠模式的笔记本电脑和其他计算机非常有用。

一旦计算机打开并启动,anacron就会检查以查看配置的作业是否错过了上一次计划的运行。 如果有,这些作业将立即运行,但仅运行一次(无论错过了多少个周期)。 例如,如果由于休假期间系统已关闭而使每周一次的作业没有运行三周,那么它将在您打开计算机后立即运行,但仅运行一次,而不是运行三次。

anacron程序提供了一些用于运行定期计划任务的简单选项。 只需将脚本安装在/etc/cron.[hourly|daily|weekly|monthly]目录中,这取决于它们需要运行的频率。

这是如何运作的? 该序列比它第一次出现要简单。

  1. crond服务运行/etc/cron.d/0hourly中指定的cron作业。
# Run the hourly jobs
SHELL = / bin / bash
PATH = / sbin: / bin: / usr / sbin: / usr / bin
MAILTO =root
01 * * * * root run-parts / etc / cron.hourly

/etc/cron.d/0hourly内容引起位于/etc/cron.hourly的shell脚本来运行。

  1. /etc/cron.d/0hour中指定的cron作业每小时运行一次run-parts程序。
  2. run-parts程序运行/etc/cron.hourly目录中的所有脚本。
  3. /etc/cron.hourly目录包含0anacron脚本,该脚本使用此处显示的/ etdc / anacrontab配置文件运行anacron程序。
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL = / bin / sh
PATH = / sbin: / bin: / usr / sbin: / usr / bin
MAILTO =root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY = 45
# the jobs will be started during the following hours only
START_HOURS_RANGE = 3 - 22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts / etc / cron.daily
7       25      cron.weekly             nice run-parts / etc / cron.weekly
@ monthly 45     cron.monthly            nice run-parts / etc / cron.monthly


/ etc / anacrontab文件的内容在适当的时间运行cron。[daily | weekly | monthly]目录中的可执行文件。

  1. anacron程序每天运行一次/etc/cron.daily中的程序 ; 它每周一次运行/etc/cron.week中的作业, 每月一次运行cron.months中的作业。 请注意每行中指定的延迟时间,这有助于防止这些作业自身和其他cron作业重叠。

我没有将完整的Bash程序放置在cron.X目录中,而是将它们安装在/ usr / local / bin目录中,这使我可以从命令行轻松地运行它们。 然后在适当的cron目录中添加一个符号链接,例如/etc/cron.daily

anacron程序并非旨在在特定时间运行程序。 相反,它打算以指定时间开始的时间间隔运行程序,例如每天的凌晨3点(请参见上面脚本中的START_HOURS_RANGE行),星期日(开始一周)和第一天这个月。 如果错过任何一个或多个周期,那么anacron将尽快运行一次丢失的作业。

捷径

上面显示的/ etc / anacrontab文件为我们提供了一些在特定的特定时间和常见时间使用快捷方式的线索。 这些单字时间快捷方式可用于替换通常用于指定时间的五个字段。 @字符用于标识cron的快捷方式。 下面的列表摘自crontab(5)手册页,显示了这些快捷键及其等效含义。

  • @reboot:重新启动后运行一次。
  • @yearly:每年运行一次,即。 0 0 1 1 *
  • @annualally:每年运行一次,即。 0 0 1 1 *
  • @monthly:每月运行一次,即。 0 0 1 * *
  • @weekly:每周运行一次,即。 0 0 * * 0
  • @daily:每天运行一次,即。 0 0 * * *
  • @hourly:每小时运行一次,即。 0 * * * *

这些快捷方式可以在任何crontab文件中使用,例如/etc/cron.d中的那些。

有关设置限制的更多信息

我使用这些方法中的大多数来计划要在计算机上运行的任务。 所有这些任务都是需要以root特权运行的任务。 根据我的经验,普通用户确实很少需要cron工作。 一个案例是开发人员用户,他需要cron工作来在开发实验室中开始日常编译。

限制非root用户对cron函数的访问非常重要。 但是,在某些情况下,用户需要将任务设置为在预先指定的时间运行,而cron可以允许他们这样做。 许多用户不了解如何使用cron正确配置这些任务,并且会出错。 这些错误可能是无害的,但通常会引起问题。 通过设置使用户与sysadmin进行交互的功能策略,单个cron作业就不太可能干扰其他用户和其他系统功能。

可以对可分配给单个用户或组的总资源设置限制,但这是另一篇文章。

有关更多信息, cron , crontab , anacron , anacrontab和run-parts的手册页都具有关于cron系统如何工作的出色信息和描述。

翻译自: https://opensource.com/article/17/11/how-use-cron-linux

cron linux

cron linux_如何在Linux中使用cron相关推荐

  1. 删除非空目录linux_如何在Linux中删除空的非空目录

    删除非空目录linux Linux file system consist of directories. A system administrator generally work with dir ...

  2. linux 杀掉php,Linux_在Linux系统中使用xkill命令杀掉未响应的进程,我们如何在Linux中杀掉一个资 - phpStudy...

    在Linux系统中使用xkill命令杀掉未响应的进程 我们如何在Linux中杀掉一个资源/进程?很明显我们会找出资源的pid然后用kill命令. 说的更明白一点,我们可以找到某个资源(比如termin ...

  3. shell中竖线的作用_如何在 Linux 中安装、配置和使用 Fish Shell?

    每个 Linux 管理员都可能听到过 shell 这个词.你知道什么是 shell 吗? 你知道 shell 在 Linux 中的作用是什么吗? Linux 中有多少个 shell 可用? -- Ma ...

  4. linux命令行运行c程序,如何在Linux中编写和运行C程序

    Linux正在成为开发人员的编程天堂,成为开源和免费操作系统. Turbo C编译器已经是一种编译程序的旧方法,所以让程序员转向Linux以获得新的编程环境. 在本文中,我们将解释如何编写,编译和运行 ...

  5. 如何在 Linux 中使用类似智能手机外观的 Conky 天气插件

    如何在 Linux 中使用类似智能手机外观的 Conky 天气插件 智能手机都拥有一些平滑地融入手机外观的天气小插件,现在幸亏有了 Flair Weather Conky,你便可以在你的 Linux ...

  6. 如何在 Linux 中创建一个共享目录

    作为系统管理员,你可能有一个特定目录,你希望为 Linux 服务器上的每个用户授予读/写访问权限.在本指南中,我们将回顾如何在 Linux 中对特定目录(共享目录)上的所有用户启用写访问. 这要求设置 ...

  7. ubuntu 安装yum_如何在 Linux 中安装微软的 .NET Core SDK | Linux 中国

    本分步操作指南文章解释了如何在 Linux 中安装 .NET Core SDK 以及如何使用 .NET 开发出第一个应用程序.-- Sk致谢译自 | ostechnix.com 作者 | Sk译者 | ...

  8. 禁止linux关机,如何在Linux中禁用关机和重新启动命令

    shutdown命令调度一个Linux系统关闭电源的时间,它也可以用于在使用特定选项调用时停止,关闭电源或重启机器 ,并重新引导系统重新启动. 默认情况下,某些Linux发行版(如Ubuntu,Lin ...

  9. linux内核如何安装vim,如何在Linux 中安装和使用 PacVim?

    描述 你好,Vim用户!今天,我偶然发现了一个很酷的程序来提高 Vim 的使用技巧.Vim 是编写和编辑代码的绝佳编辑器.然而,你们中的一些人(包括我)仍在陡峭的学习曲线中挣扎.再也不用了!来看看 P ...

最新文章

  1. 【我的Android进阶之旅】解决SDK升级到27.0.3遇到的GLIBC_2.14 not found、no acceptable C compiler found in $PATH等问题...
  2. Python进阶09 filter函数
  3. scala-04For与Function进阶实战、Lazy的使用
  4. 财务 计算机网络,计算机网络技术在财务系统中的应用
  5. Boost使用几条简单笔记
  6. c++中基本的语法问题
  7. Map 四种获取 key 和 value 值的方法,以及对 map 中的元素排序
  8. caffe prototxt 可视化工具
  9. Python的迭代器和生成器
  10. php分布式缓存系统 Memcached 入门
  11. 11月百度凤巢升级后的变化
  12. [Verilog] 实现数字钟(自动计时+手动校准+倒计时+设置闹钟)附完整源代码
  13. 有关二叉树方法java实现
  14. 数据库面试题(答案)
  15. 2000坐标系xy坐标几位_2000坐标系(2000坐标系x和y坐标几位数)
  16. node 拦截器拦截请求下载电子书以及等待前端渲染操作、浏览器操作
  17. CentOS7和CentOS8 FreeSWITCH 1.10.7 简单图形化界面18--内网的讯时FXO网关SIP对接到内网的FreeSWITCH
  18. Oracle Database 11g Release 2认证支持的操作系统版本跨度很大
  19. 2016亚洲城市GDP50强出炉
  20. Secure Boot什么意思?BIOS中Secure Boot灰色无法更改解决方法详解

热门文章

  1. 面试题:请介绍⼀下 JMM(Java 内存模型)
  2. 如何关闭kafka的控制台日志
  3. Java会话技术之 —— Spring Session
  4. 立即执行函数(IIFE)闭包
  5. mysql lower_case_table_names 区分表名大小写设置
  6. 《Python自然语言处理》——1.8 练习
  7. 存储时间:立足SATA 百变GoFlex只是开始
  8. win2003负载均衡设置
  9. java对mysql的简单操作的综合运用——登录系统
  10. acm 凹多边形面积_解析几何|面积的计算