Linux中的Crontab

时间:2020-03-05 15:26:27  来源:igfitidea点击:

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个星号。

一分钟小时日期一个月日名称命令
*/53-6*/5*/20,6echo “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