crontab 用于自动化 Linux 系统上的所有类型的任务。 对于有抱负的系统管理员来说,这是一项特别重要的技能。 如果您是初学者,开始可能会有些挑战。 语法与大多数其他命令不同。 出于这个原因,在我向您展示一些用途之前,本课将包含更多背景信息。
不要被 crontab 吓倒
对我来说,Crontab 作为一个新手,是比较吓人的 Linux 概念之一。 在我被介绍到“crontab”时,我只使用了几天命令行,几乎不了解如何使用“ls”和“cd”等基本文件导航命令。
我提出我个人学习历史的原因是,我预计许多 Linux 新用户在看到 ‘crontab’ 的独特语法时可能会感到同样不知所措。 不过,我可以向您保证,一旦您了解了它的工作原理,它并没有那么复杂。
您将在本指南中学到什么
我想快速介绍一下 crontab 所涉及的一些概念,以便于理解。 我的目标是将这些概念置于上下文中,并说明它们如何相互关联。
- Cron 概念快速介绍
- 为您的用户帐户设置 crontab 访问权限
- 使用您的 cronjobs 处理错误
- 创建 cronjobs
快速介绍关键 cron 概念
让我首先向您介绍一些有关“cron”的基本概念。
Cron、Crontab 和 Cron Job 的区别
直观地看待事物有助于更快地理解新主题。 以下是这三个主题通常如何相互作用的细分。 然后,我将更详细地描述每一个。
元素 | Linux 名称 | 意义 |
---|---|---|
守护进程 | ‘crond’ | 发音为“demon”或“day-mon”。 这些是 Linux 后台系统进程。 |
桌子 | ‘crontab’ | 您在输入 crontab 命令时将行写入此表。 每个“*”星号代表一段时间和每行中的对应列。 |
工作 | 定时任务 | 连续描述要执行的特定任务,与其指定的时间 id 配对 |
Cron 表
Crontab 代表 Cron 表。 这是一个 Linux 系统文件,它创建一个类似表格的结构,其中字段由空格分隔。 用户可以通过为每个字段(星号)分配值来填充表格。
在整篇文章中,我可能会使用不同的语言来描述这个想法。 要清楚一个字段、单元格、列等都指的是同一件事。 如果有帮助,您可以将您的 crontab 视为一个小型数据库。
定时任务
如果您不熟悉数据库,您可以想象空白中的单元格 Excel 文件。 无论哪种方式,对于这个类比,每个星号代表一列,其含义由其标题定义。 最后一列将是对命令或脚本的调用。 每个完整的行都可以被认为是一个单独的工作。 这些通常被称为“cron 作业”,尽管作业、任务等都是可互换的术语。
Cron 守护进程
我们已经讨论了表格以及我们如何在表格中填充工作。 但是,这些工作是如何执行的呢? 一个称为守护进程的系统进程在我们的 Linux 机器的后台运行。
有许多不同服务的守护进程。 这些通常通过在服务名称后加上“d”来命名。
自然地,cron 守护进程被称为“crond”。 我们不需要执行任何操作来执行该守护程序,但如果您认为该命令无法正常工作,您可以使用 ps 命令来验证“crond”是否正在运行。
ps aux | grep crond
此命令将搜索所有用户的当前进程并返回任何“crond”实例。
[email protected]:~$ ps ux | grep crond
christo+ 8942 0.0 0.0 18612 840 pts/0 S+ 02:16 0:00 grep --color=auto crond
我可以看到守护程序正在为我的用户帐户运行。 我已经知道这一点,因为我整天都在用输出填充一个文件。
了解 crontab 语法
现在您对 cron 的工作原理有了一个模糊的了解,让我们看一下使用 crontab 的语法。 如果您可以将这些信息想象为您的脑海中的表格,我希望它不会那么混乱。
crontab [options]
* * * * * <command>
OR
* * * * * <path/to/script>
我保证一旦我们得到我们自己的 example 启动并运行。 让我们再次回顾一下 cron 作业的语法。
如您所见,crontab 语法有 5 个星号。 以下是每个星号所代表的内容:
第一 | 第二 | 第三 | 第 4 名 | 第 5 名 | |
---|---|---|---|---|---|
* | * | * | * | * | |
ID | 分钟 | 小时 | 日期 | 月 | 日期名称 |
价值观 | 0-59 | 0 -23 | 1-31 | 1-12 | 0-6 |
注意:日期名称 0-6 以星期日开头。
为了安排任务,您可以将相应的星号替换为您想要的值。
让我们快速练习一下。 如果你有像下面这样的 crontab,你认为这项工作什么时候会运行?
0 0 * * 0
问:如果你这样设置作业,命令什么时候运行?
A. 从星期一到星期六的每个小时
B. 周日的每一分钟
C. 仅在周一至周六的午夜
D. 仅在周日午夜
这里的答案是 D. 在 00:00 运行“命令” [midnight] 每个星期天。
为您的用户帐户设置 crontab cccess
Crontab 是特定于用户的。 你已经谈到了一点。 如果您认为您之前可能已经使用过 crontab,您可以使用 crontab -l.
[email protected]:~$ crontab -l
no crontab for christopher
[email protected]:~$ crontab -e
no crontab for christopher - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/code
3. /bin/ed
Choose 1-3 [1]: 1
当我运行这个命令时,你可以看到我在这个系统上没有 crontab。
由于我还没有创建 crontab,所以当我使用 -e
要编辑表格,它会提示我选择我喜欢的文本编辑器。 纳米 建议作为最容易使用的程序。 您可以使用任何命令行文本编辑器,例如 Vim 或 Emacs。 这真的取决于你。
如果一开始你没有成功,须藤
如果您尝试 crontab -e 命令但没有得到这个结果,你可能没有创建表的用户权限。 如果你有 sudo 访问,您可以使用 sudo 设置 crontab。
sudo crontab -e <your_username>
您的系统会自动将您的 crontab 加载到正确的目的地,该目的地可能因分布而异,但通常位于类似的目录中 /var/spool/cron/crontabs. 不要尝试在此处编辑文件。
如果 cron 作业遇到错误会怎样?
默认行为是通过电子邮件发送它的输出。 此功能专为可以自动将日志发送到网络域上的“本地”电子邮件的管理员而设计。
如果您有邮件服务器,您可以自行设置。 还有一些方法可以自动将电子邮件输出到 GMail 或类似服务。 但是,这些方法超出了本文的范围。
相反,我们将研究解决错误的两种常见方法。
1) 将输出发送到文件
您可以为要发送到此类输出的文件指定一个文件,然后使用 >>
重定向输出。
使用 >>
将信息附加到现有文件,而单个 >
符号将覆盖文件。 如果您想维护一个经常更新记录的大型日志文件,了解这一点很重要。 如果文件不存在,两者都会自动创建文件。
Cron 作业示例:
0 * * * * echo "Linux is Cool!" >> ~/crontab_log.txt
2) 使用 /dev/null
这将通过实质上删除数据来绕过电子邮件选项。 标准错误(’2’)和标准输出(’1’)都被发送到空文件。
0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1
您可能已经注意到我在示例中使用了 echo 命令。 没有什么特别的原因,但它可以很容易地验证更改和“检查你的工作”。
如果你做过一些编程,你可能已经使用打印命令来测试你的逻辑。 这是同一个概念。
让我们尝试设置我们自己的 cron 作业。 如果您已经“一起玩”,那就太好了。 如果没有,现在是时候准备好那个终端并享受一些乐趣了。
crontab 示例:调度命令和脚本
在解释输出如何路由时,我向您展示了几个示例。 这些对你有意义吗?
让我先走一遍 example.
分钟 | 小时 | 日期 | 月 | 日期名称 | 命令 |
---|---|---|---|---|---|
0 | * | * | * | * | echo “Linux 很酷!” >> ~/crontab_log.txt |
将分钟值设置为“0”意味着该命令将每小时运行一次。
高级作业计划
您可以一次编辑多个值。 如果需要,您可以将所有 5 个星号替换为规格。
分钟 | 小时 | 日期 | 月 | 日期名称 | 命令 |
---|---|---|---|---|---|
*/5 | 3-6 | */5 | */2 | 0,6 | echo “Linux 很酷!” >> ~/crontab_log.txt |
知道这个说什么吗? 为了本教程,我使这项工作特别混乱。 “在野外”有这么多参数的东西是不寻常的,但让我们看看你是否能破译它。 对于这样的事情,我喜欢在田野中倒退。
让我们一起试试:
场地 | 价值 | 意义 |
---|---|---|
日期名称 | 0,6 | 星期六和星期日 |
月 | */2 | 可以被 2(偶数)个月整除的每个月。 |
日期 | * | 每个日期 |
小时 | 3-6 | 凌晨 3 点到 6 点之间 |
分钟 | */5 | 每 5 分钟 |
用简单的语言:
所以每隔一个月,在周末,无论日期如何,这个命令都会在凌晨 3 点到 6 点之间每 5 分钟运行一次。
哇,这很令人费解。 如果您能够遵循这一点,那么您就准备好与他们中的佼佼者一起进行 cron 工作。
编写一个简单的 cron 自动化脚本来备份文件
到目前为止,您编写的 cron 作业只做了一件事。 这可能很有用,但也许您想要执行多项任务。
幸运的是,这不仅是可能的,而且非常容易。 如果您还记得原始语法 example,您还可以使用脚本的路径。
这不仅限于 bash 或者,您还可以实现使用 Python 的脚本或 Perl 如果你想。
我们的目标是什么?
- 作业将在每晚凌晨 3 点处理
- 将 /Documents 文件夹备份到 zip 文件
- 生成一个包含目录中所有内容列表的文本文件
- 创建一个存档文件夹,将我们的备份和文本文件克隆到具有当前日期的子文件夹中
our_backup_script.sh
#! /bin/bash
DATE=$(date +%d-%m-%Y)
# Date in format DAY##-MONTH##-YEAR####
mkdir -p ~/archive/$DATE
# create a folder for today's date in the archive, if archive doesn't exist, make archive
ls -al ~/Documents > ~/archive/$DATE/contents.txt
# create a text file listing the contents of the documents folder
cd ~/ && tar -cpzf $DATE.docs.backup.gz Documents/*
# change to parent directory to tar /Documents folder
cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz
# one .gz file is left in the home directory, a clone is sent to our archive under it's date
christoph[email protected]:~$ ls
Desktop Downloads Music Pictures Public Videos
Documents ENV our_backup_script.sh projects Templates 'VirtualBox VMs'
[email protected]:~$ bash our_backup_script.sh
[email protected]:~$ ls
25-11-2019.docs.backup.gz Documents Music projects Videos
archive Downloads our_backup_script.sh Public 'VirtualBox VMs'
Desktop ENV Pictures Templates
[email protected]:~$ ls archive/25-11-2019/
contents.all_files.txt documents_archive.gz
剩下要做的就是让这个脚本成为一项 cron 工作。
crontab -e
并在其中添加以下内容:
0 3 * * * bash ~/our_backup_script.sh
你的成功了吗? 我的是。 事实上,我非常喜欢这个主意,我可能会把它作为日常备份。 我将进行的一项修改是将我的存档移动到我机器上与云存储同步的文件夹中。
在 Linux 中安排作业的另一种方法是使用 at 命令。 您可能也有兴趣了解这一点。
您对可能要创建的脚本有什么想法吗? 这篇文章有没有帮助你更好地理解 crontab? 在评论中与我们分享。