cron linux_如何在Linux中使用cron

2023-11-14

cron linux

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

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

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

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

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

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

  • 我的许多计算机上的系统时间(即操作系统时间)是使用网络时间协议(NTP)设置的。 NTP设置系统时间时,没有设置硬件时间,硬件时间可能会漂移。 我使用cron根据系统时间设置硬件时间。
  • 我还有一个每天清晨运行的Bash程序,该程序在每台计算机上创建一个新的“每日消息”(MOTD)。 它包含诸如磁盘使用情况之类的信息,这些信息应该是最新的以便有用。
  • 许多系统进程和服务,例如LogwatchlogrotateRootkit 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是一些应用程序(例如SpamAssassinsysstat )安装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作业就不太可能干扰其他用户和其他系统功能。

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

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

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

cron linux

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cron linux_如何在Linux中使用cron 的相关文章

随机推荐

  • 类和对象【默认成员函数】

    全文目录 类的6个默认成员函数 构造函数 特性 析构函数 特性 拷贝构造函数 特性 赋值运算符重载 运算符重载 赋值运算符重载 前置 和 后置 const 成员 取地址及const取地址操作符重载 类的6个默认成员函数 每个类不管有没有内容
  • Java进阶01:Hibernate教程

    1 什么是Hibernate Hibernate是一个开放源码的ORM Object Relational Mapping 对象关系映射 框架 它对JDBC进行了轻量级的封装 使得Java开发人员可以使用面向对象的编程思想来操作数据库 2
  • FISCO BCOS 和 WeBASE-Front 搭建联盟链

    一丶环境依赖 安装ubuntu依赖sudo apt install y openssl curl 安装centos依赖sudo yum install y openssl openssl devel 二丶创建操作目录cd mkdir p f
  • HTML案例设计(用户信息提交表单)

    最近学习了HTML语法知识 详见内容请戳此次HTML基础知识 遂做了此前端界面 比较简略 但是算对Web开发有了初步的认识 先放效果图出来 你的三连就是我创作的动力 HTML代码 本次知识点将会不定期补充 div align center
  • 智能学习

    智能学习 MATLAB实现CS BP多变量时间序列预测 布谷鸟搜索算法优化BP神经网络 目录 智能学习 MATLAB实现CS BP多变量时间序列预测 布谷鸟搜索算法优化BP神经网络 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍
  • HTML静态页面获取url参数和UserAgent

    目录 前言 原因 解决 1 静态页面获取url的参数 2 取useragent的值 3 测试页面 前言 接技术支持小伙伴信 有用户反馈app在华为设备上下载不了 以为是服务器覆盖的范围不够或服务器挂了 直到另一个客服同事发来一个录屏 基本知
  • 自己写ArrayList后的心得

    源码分析 ArrayList应该是Java工具类中最简单的一个 它的内部实现是一个数组 在首次加入元素时 ArrayList会创建一个默认大小的数组 之后的添加 删除 查询操作都是对该数组进行操作 而我自己写的ArrayList则是和Lin
  • 记录错误:FileNotFoundError: [WinError 3] 系统找不到指定的路径。: ‘E:\\CV_Paper_fuxian\\lesson\\B_VGG\\..\\Data\\tra

    撸代码发现错误 FileNotFoundError WinError 3 系统找不到指定的路径 E CV Paper fuxian lesson B VGG Data train 经过检查发现 是系统内文件夹名称设置错误 如果出现这样的错误
  • new与malloc

    1 属性 new delete是c 运算符 关键字 需要编译器支持 malloc free是库函数 需要头文件支持 2 参数 使用new操作符申请内存分配时无需指定内存块的大小 编译器会根据类型信息自行计算 而malloc需要显示的指出所需
  • java/php/net/python家庭财务管理系统设计

    本系统带文档lw万字以上 答辩PPT 查重 如果这个题目不合适 可以去我上传的资源里面找题目 找不到的话 评论留下题目 或者站内私信我 有时间看到机会给您发 管理员用例图 系统中的核心家庭是系统管理员 管理员登录后 通过管理员菜单来管理后台
  • 03. HTTP协议

    目录 HTTP协议 基本概念 请求 响应 请求头中最常见的 些重要内容 爬虫需要 响应头中 些重要的内容 请求方式 总结 HTTP协议 基本概念 协议 就是两个计算机之间为了能够流畅的进行沟通而设置的 个君子协定 常见的协议有TCP IP
  • firefly的使用

    https github com 9miao Firefly gitpython setup py install firefly admin py createproject myproject 就可以创建一个新的工程了 转载于 http
  • mac os 安装metasploit v5.0.23(msf)

    安装metasploit git clone https github com rapid7 metasploit framework git cd metasploit framework msfconsole 执行上面的命令时 报如下错
  • 台式机常见问题汇总

    1 第一步 必须安装硬盘 硬盘安装在中间 否则安装电源后 硬盘不好安装了 2 第二步 检查台式机的数据线 应该是给足的 3 开机启动后 电脑吱吱响 后来找到原因 硬盘四个固定角没有固定好 所以转起来震动噪音 4 硬盘安装时 用的螺丝是接触面
  • 太空狼人杀(Among US)只能QuickChat 更改年龄限制达到可以Free To chat方法

    Among us 不能自由聊天的解决方法 对于年龄数据被上传到服务器的账号 可能不适用 1 进入 C Users 你的账户名 AppData LocalLow InnerSloth Among Us playerPrefs 如果看不到App
  • centos 安装alien

    出处 http linux4you in install netapp oncommand system manger on centos 1 在root权限下执行命令 sudo su 2 安装alien需要的依赖包 yum y insta
  • springmvc源码学习(二十七)异步任务超时异常的执行流程

    目录 前言 一 示例 二 源码分析 总结 前言 本文分析异步任务出现超时及异常的情况时的处理流程 一 示例 设置超时时间为2s 但任务需要执行10s ApiOperation value test notes test GetMapping
  • zsh + oh-my-zsh 主题预览

    The Themes robbyrussell the default that Robby uses The rest of the themes in alphabetical order af magic afowler agnost
  • 区块链技术之哈希指针

    hello 大家好 我们第三期的区块链技术分享来啦 那么话不多说 我们开始吧 提起区块链 大家可能都会提到 不可篡改 但是为什么区块链不可篡改呢 先给出答案 这与区块链的数据结构哈希指针和默克尔树有关 那么我们今天先分享哈希指针相关的内容
  • cron linux_如何在Linux中使用cron

    cron linux 本文最初发布于2017年11月 现已更新以包含其他信息 成为系统管理员的挑战 其中有很多优点 之一是当您想睡觉时正在运行任务 例如 某些任务 包括定期重复执行的任务 需要在没有人使用计算机资源的情况下通宵运行或在周末运