Linux中的Crontab
crontab用于在Linux系统上自动执行所有类型的任务。
Cron,Crontab和Cron Job之间的区别
部件 | Linux名称 | 说明 |
---|---|---|
守护进程 | 'crond' | 发音为“恶魔”或者“天周年”。这些是Linux背景系统进程。 |
数据表 | 'crontab' | 输入Crontab命令时,我们将行写入此表。每个'*'星号表示一段时间和每行中的相应列。 |
任务 | Cron工作 | 要执行的特定任务,与其指定的时间ID一起配对 |
Cron表
Crontab代表Cron Table。
这是一个Linux系统文件,它创建一个表状结构,其中各字段之间用空格隔开。
用户可以通过将值分配给每个字段(星号)来填充表。
在整篇文章中,我可能会使用不同的语言来描述这个想法。
为了清楚起见,字段,单元格,列等均指同一事物。
如果有帮助,我们可以将crontab视为小型数据库。
cron任务 计划任务
如果我们不熟悉数据库,可以想像一下空白Excel文件中的单元格。
无论哪种方式,对于此类推,每个星号都代表一列,其含义由其标题定义。
最后一列将是对命令或者脚本的调用。
每个完整的行都可以视为一个单独的工作。
尽管作业,任务等都是可以互换的术语,但这些通常被称为“定期作业”。
Cron守护进程
我们已经讨论了表格以及如何用作业填充表格。
但是,这些工作如何执行?
一个名为Daemon的系统进程在我们的Linux机器的后台运行。
有许多不同服务的守护程序。
这些通常通过在服务名称后缀“ d”来命名。
自然地,cron守护程序称为“ crond”。
我们不需要执行任何操作即可执行该守护程序,但是,如果我们认为该命令无法正常运行,则可以使用ps命令来验证“ crond”是否正在运行。
ps aux | grep crond
此命令将搜索所有用户的当前进程,并返回所有“ crond”实例。
Hyman@theitroad:~$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>
我保证,自从我们建立起并运行自己的示例以来,这将对我们有所帮助。
让我们再次介绍cron作业的语法。
如我们所见,crontab语法有5个星号。
以下是每个星号所代表的含义:
| |第一|第二|第3 |第四|第五|
| --- - | --- | - - | --- | - - | - |
| | * | * | * | * | * |
| ID |一分钟|小时|日期|一个月|日名称|
|价值| 0-59 | 0 -23 | 1-31 | 1-12 | 0-6 |
注意:天名称0-6以星期日开始。
为了安排任务,请用所需的值替换相应的星号。
让我们进行一些快速练习。
如果crontab如下所示,那么我们认为该作业什么时候运行?
0 0 * * 0
问:如果以这种方式设置作业,什么时候可以运行命令?
A.从星期一到星期六的每个小时B.在星期日的每一分钟C.仅在星期一至星期六的午夜D.仅在星期日的午夜
答案是D。
每个星期日的00:00 [午夜]运行“命令”。
为用户帐户设置crontab访问
Crontab是特定于用户的。
我们已经稍微提到了这一点。
如果我们认为以前可能已经使用过crontab,则可以使用crontab -l进行检查。
Hyman@theitroad:~$crontab -l no crontab for christopher Hyman@theitroad:~$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来编辑表时,它会提示我输入首选的文本编辑器。
建议使用Nano作为最简单的程序。
我们可以使用任何命令行文本编辑器,例如Vim或者Emacs。
完全取决于我们。
如果一开始我们没有成功,Sudo
如果尝试使用crontab -e命令,但没有得到此结果,则可能没有用户权限来创建表。
如果我们具有sudo访问权限,则可以使用sudo设置crontab。
sudo crontab -e <your_username>
系统会自动将crontab加载到适当的目标位置,该目标位置可能会因分布而异,但通常位于/var/spool/cron/crontabs之类的目录中。
不要在这里尝试编辑文件。
如果cron作业遇到错误怎么办?
默认行为是通过电子邮件发送其输出。
此功能是专为可以自动将日志发送到网络域上的“本地”电子邮件的管理员设计的。
如果我们有邮件服务器,则可以自己进行设置。
还有一些方法可以自动将电子邮件输出到GMail或者类似服务。
但是,这些方法不在本文的讨论范围之内。
取而代之的是,我们将着眼于解决该错误的两种常见方法。
1)将输出发送到文件
我们可以为要发送到这种类型的输出指定一个文件,然后使用>>
重定向输出。
使用>>
会将信息添加到现有文件中,而单个>
符号将覆盖该文件。
重要的是要知道是否要维护一个大的日志文件,该文件会经常更新记录。
如果该文件不存在,两者都将自动创建该文件。
Cron Job示例:
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示例:调度命令和脚本
在解释输出路由时,我向我们展示了一些示例。
这些对我们有意义吗?
让我来看第一个例子。
一分钟 | 小时 | 日期 | 一个月 | 日名称 | 命令 |
---|---|---|---|---|---|
0 | * | * | * | * | 回声“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作业仅做一件事。
这可能很有用,但也许我们想执行多个任务。
幸运的是,这不仅可能而且非常容易。
如果我们还记得原始的语法示例,则还可以使用脚本路径。
这不仅限于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
Hyman@theitroad:~$ls Desktop Downloads Music Pictures Public Videos Documents ENV our_backup_script.sh projects Templates 'VirtualBox VMs' Hyman@theitroad:~$bash our_backup_script.sh Hyman@theitroad:~$ls 25-11-2019.docs.backup.gz Documents Music projects Videos archive Downloads our_backup_script.sh Public 'VirtualBox VMs' Desktop ENV Pictures Templates Hyman@theitroad:~$ls archive/25-11-2019/ contents.all_files.txt documents_archive.gz
剩下的要做的事情就是使此脚本成为cron工作。
crontab -e
并其中添加以下内容:
0 3 * * * bash ~/our_backup_script.sh