Ubuntu下使用Cron定时任务

Ubuntu下使用Cron定时任务

概述

Cron Job是一个Linux 程序,它允许用户安排某个软件的执行,通常以 shell 脚本或已编译的可执行文件的形式出现。Cron 通常用于需要按固定时间表运行任务和/或自动执行重复任务(如下载文件或发送电子邮件)的情况。

从最基本的层面上讲,cron 作业是写入名为cron 表(简称为crontab )的表中的一个条目。此条目包含一个计划和一个要执行的命令。cron 守护程序 ( crond ) 会查找 crontab 中的条目,以确定应运行哪些作业以及应根据指定的计划在何时运行这些作业。

Cron 工作原理

大多数标准的 cron 安装包含两个命令:

  • croncrond,这是运行调度实用程序的守护进程
  • crontab,这是允许您编辑作业的 cron 条目的命令

从 Linux 的角度来看,守护进程是指在后台运行且非交互的程序。这意味着该程序不接受任何用户输入,也不向用户显示输出。守护进程一词过去常用于 Unix/Linux 环境,并不是不同操作系统的通用术语。

守护进程将在root用户下运行。您可以运行以下命令来查看 cron 是否正在运行:

ps aux | grep cron

你应该看到如下输出:

root      1111  0.0  0.0  29008  3012 ?        Ss   Aug26   0:01 /usr/sbin/cron -f

如果您根本没有收到命令的任何输出,则 cron 没有运行或未安装。

在 Ubuntu 上,您可以通过运行以下命令快速安装 cron:

sudo apt update && sudo apt install cron

crontab的基本指令使用

查询

#查看当前用户下的定时任务列表
crontab -l

在这里插入图片描述

编辑

#编辑当前用户下的定时任务
crontab -e

在第一次编辑时会有选择编辑器的选项,我们通过选择对应的选项来确定自己所要的编辑器,第二次将不会再次弹出下面图片选择界面,如果想要切换别的编辑器需要通过指令select-editor进行修改。

请添加图片描述
请添加图片描述

看下第一行:

MAILTO这个是直接用户的邮件地址

如果任务产生输出的话,cron 会将执行的任务的输出信息发送到指定的用户邮件。这可以通过在 crontab 文件中设置 MAILTO 变量来配置,也可以在命令行中使用

MAILTO=user@example.com

第二 行为 Cron 定时任务的配置接下来会讲

我们再次使用用查看当前用户下的定时任务列表指令

在这里插入图片描述

删除

#删除当前用户下的定时任务
crontab -r

在这里插入图片描述

Cron 定时任务语法

基本的 crontab 条目看起来像这样,首先是 cron 作业计划,然后是运行的命令:

任务配置的基本格式
*   *   *  *   *  command
分   时   日  月   周  命令

*    *    *    *    *   /home/user/bin/somecommand.sh
|    |    |    |    |            |
|    |    |    |    |    指令(Command or Script to execute)
|    |    |    |    |
|    |    |    | 	周(0-6 | Sun-Sat)
|    |    |    |
|    |    |  月份(1-12)
|    |    |
|    |   日期(1-31)
|    |
|   小时(0-23)
|
分钟(0-59)

实例:

#分      时      日     月     周     命令
 *       *      *      *      *    /path/to/script.sh #每分钟执行一次
 */5     *      *      *      *    /path/to/script.sh #每5分钟执行一次
 1-59/5  *      *      *      *    /path/to/script.sh #从1到59分每5分钟一次
 0       * 		* 	   * 	  *	   /path/to/script.sh #每1小时执行一次,也就是在0分钟时执行一次
 0       */5    *      *      *    /path/to/script.sh #每5小时执行一次
 0       9-17   *      *      *    /path/to/script.sh #从9点到17点每小时0分
 0       0      *      *      *    /path/to/script.sh #在每天的00:00执行一次
 0       8      *      *      *    /path/to/script.sh #在每天的08:00执行一次
 0       0      *      *      SUN  /path/to/script.sh #每周六的00:00执行一次
 0       0      *      *      1-5  /path/to/script.sh #从周一到周五,每天的00:00执行一次
 0       0      *      *      6,0  /path/to/script.sh #周六和周日的00:00执行一次
 0       0      1      *      *    /path/to/script.sh #每月1日00:00执行一次
 0       0      1      */2    *    /path/to/script.sh #每2月的第一天0点执行一次
 0       0      1      1      *    /path/to/script.sh #每年1月1日0点执行一次

特殊字符:

周的数字代表的是星期几,0和7都代表星期天;
*(星号):型号标识任何的意思,就是无论什么数值都符合条件;
,(逗号):标识分割时段的意思,如3,6标识的是3和6都可以;
-(减号):代表一定的范围段,包头尾,如3-5,标识3,4,5都可以;
/n(斜线):标识间隔,即间隔n致性一次,如分钟设置为/5或者0-59/5就是标识每个5分钟执行一次。

另一种写法

如果没有对具体时间点的要求可以使用

@yearly “0 0 1 1 *”

@monthly “0 0 1 * *”

@weekly “0 0 * * 0”

@daily “0 0 * * *”

@hourly “0 * * * *”

用户的crontab 文件

在 Linux 中,每个用户都有自己的 crontab,可用于安排以该用户身份运行的作业。crontab 文件存储在 中/var/spool/cron/crontabs,每个文件都以创建它的用户帐户命名。您不应直接更新这些文件,而是可以使用命令查看、更新和删除用户 crontab 文件crontab

在这里插入图片描述

系统的crontab 文件

文件**/etc/crontab**是系统生成的文件,

在这里插入图片描述

test -x /usr/sbin/anacron #表示 “检测文件 /usr/sbin/anacron 是否存在且具有“可执行”权限”

即,判断系统是否安装了 anacron , 若安装了,则忽略 /etc/crontab 中的这三条定时任务,改为使用 /etc/anacrontab 中的配置。

在这里插入图片描述

run-parts --report遍历目标文件夹,执行第一层目录下具有可执行权限的文件;以root的身份执行。
上面的额四个定时器的意思就是,每小时执行一次的脚本。每天执行一次的脚本。每周执行的脚本。每月执行的脚本。

cron.hourly 下的脚本每小时执行一次
cron.daily 下的脚本每天执行一次
cron.weekly 下的脚本每周执行一次
cron.monthly 下的脚本每月执行一次

cron 任务设置环境变量

为 cron 作业设置环境变量时,您可以根据具体要求选择多种选项,包括:

  1. 直接在 crontab 文件中声明变量。
  2. 将变量声明为命令行的一部分。
  3. 在执行命令之前从文件加载变量。

1. 直接在 crontab 中声明变量

 APP_ENV=production
 PATH=/root/it/scripts
 0 0 * * * example.sh

​ 我们配置了 PATH 变量和自定义应用程序变量。当 cron 作业运行时,它将example.sh在提供的变量中查找PATH,并且当命令运行时,其环境也将包括PATHAPP_ENV变量。您可以根据需要为作业设置任意数量的不同变量,它们可以位于 crontab 文件中的任何位置。

​ 直接在 crontab 中设置这些变量的一个优点是它们清晰易找。任何试图理解 crontab 文件的人都会看到其作业所需的每个变量。

2. 将变量声明为命令的一部分

​ 当您在 Linux 和其他“posix”操作系统上运行命令时,可以内联声明环境变量,这也适用于 crontab。在这里您可以看到一个示例,其中两个作业为同一变量获取不同的值。

 0 * * * * APP_ENV=production /var/data-analytics/export-to-datalake.py  # Every hour
 0 0 * * * APP_ENV=staging    /var/data-analytics/export-to-datalake.py  # Once a day

​ 如果您在不同作业中需要不同的值,这是设置环境变量的最佳方法。(在此示例中,我们仅设置一个变量,但您可以根据需要设置任意多个变量。)

3. 从文件加载变量

​ 如果您有大量环境变量,或者它们由 Ansible 或 Consul 等工具集中控制,则可以直接在文件中声明它们,并希望在任何地方重复使用。在这种情况下,您可以source将该文件直接作为命令字符串的一部分。文件中导出的任何变量都将成为作业环境的一部分。

 0 * * * * source /var/data-analytics/bootstrap.sh; /var/data-analytics/export-to-datalake.py

使用环境变量控制 cron 行为

直接在 crontab 文件中声明的环境变量也可用于 cron 本身,有些变量可用于控制 Cron 在运行作业时的行为。以下是您可以在自己的 crontab 中尝试的 5 个变量:

1.路径

当运行命令时没有使用完整路径,您的 shell 将在变量指定的位置查找该命令PATH。如果没有PATH设置,则唯一检查的位置将是当前工作目录。当您设置 PATH 变量时, cron 本身将使用它来定位您的脚本/二进制文件。

 PATH="/users/dataproc/bin:/var/data-analytics/bin:/root/it/scripts"

您可以添加任意多个位置,通常以冒号分隔,并且将按照您书写的顺序进行搜索。

2. MAILTO 和 MAILFROM

您的作业写入stdoutstderr由 cron 收集并在作业完成后通过电子邮件发送的任何内容。这通常是垃圾邮件的烦人来源,尤其是对于经常运行的作业,而阻止电子邮件的最常见建议是确保您的作业永远不会写入 stderr 或 stdout。该技术可以阻止单个作业的电子邮件,但有一种更简单的方法可以阻止 cron 发送电子邮件:设置MAILTO环境变量。

MAILTO=""

或者,如果您发现 cron 电子邮件有用,请使用它MAILTO来指定收件人电子邮件,甚至可以使用变量设置自定义“发件人”地址,MAILFROM以便更轻松地过滤和处理邮件。

注意:您的主机需要配置为发送外部电子邮件的消息传输代理 (MTA)

3. 外壳

默认情况下,cron 使用经典的“dash”shell at/bin/sh来调用命令,而一些在交互式 bash 提示符下可用的功能在 dash 中不可用。您可以使用变量告诉 cron 使用 bash、zsh 或任何其他 shell SHELL

SHELL=/bin/bash

4. CRON_TZ

Cron 作业在系统时钟设置的任何时区运行。默认情况下,这是 UTC,但 cron 作业通常用于根据世界各地的挂钟时间执行操作。通过CRON_TZ在 crontab 中添加声明,您可以控制 Cron 在启动作业时使用的时区。

 CRON_TZ=America/New_York

5. 随机延迟

一些 cron 的实现,包括anacron,允许随机延迟所有作业,方法是使用RANDOM_DELAY变量来定义要延迟的最大分钟数。

RANDOM_DELAY=3

**提示:**如果你想为单个作业添加延迟,你可以使用sleep命令

0 0 * * * sleep ${RANDOM:0:1} && /path/to/executable

每 30 秒运行一次 cron 任务

​ 要每 30 秒运行一次 cron 作业,请安排每分钟的crontab 条目,并使用 bash 脚本运行作业两次,中间间隔 30 秒。以下是该 shell 脚本的示例:

#!/bin/bash
for (( i=1; i<=2; i++ )); do
    python /home/crons/send-updates.py &
    sleep 30
done

​ 在这种情况下,我们将此脚本另存为/home/crons/send-updates-wrapper.sh,但无论将其保存在何处,都不要忘记通过运行使其可执行chmod +x /home/crons/send-updates-wrapper.sh。您的 crontab 条目应如下所示:

* * * * * /home/crons/send-updates-wrapper.sh
Ubuntu中,我们可以使用cron服务来设置定时任务cron是一个Linux下的后台进程,用来定期执行一些任务。在Ubuntu环境下,我们可以使用以下命令来管理cron服务: 1. 列出某个用户cron服务的详细内容:`crontab -l` 2. 删除某个用户的cron服务:`crontab -r` 3. 用指定的文件替代目前的cron服务:`crontab file \[-u user\]` 4. 编辑某个用户的cron服务:`crontab -e` 5. 指定crontab的目录:`crontab -c dir` 通过编辑cron服务,我们可以设置定时执行的任务。在cron配置文件中,我们可以指定命令行及其调用时间,以实现定时任务的功能。在Ubuntu 18.04和20.04上,我们可以使用cron文件语法来设置定时启动任务,满足我们的需求。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [ubuntu定时执行脚本任务](https://blog.youkuaiyun.com/lovely_yoshino/article/details/122496930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [linux定时执行脚本](https://blog.youkuaiyun.com/anyuta5577/article/details/102418177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值