在Linux中的Crontab – 实时示例和工具

让我们来探索crontab以及与crontab相关的命令和各种操作。

我们将学习如何使用cron实用程序安排任务,并最后讨论一些在线工具,这些工具可以帮助我们格式化和测试cron命令。

起源

Crontab代表“cron表”。cron一词来源于希腊词Chronos,意为时间。Crontab是一个系统守护进程,它会根据预定的时间自动执行一些任务和作业。

用例

Crontab可用于执行各种操作,例如处理自动备份、轮转日志文件、在远程机器之间同步文件和清理临时文件夹等。Crontab可用于任何类型的工作,但当我们开始处理system administration类型的工作时,它尤为有用。

使用cron,administrator可以安排在特定时间和日期运行作业。

那么让我们看看如何设置这个。

Crontab语法

要执行一系列命令,cron实用程序读取配置文件。为了解释crontab配置表中的行,它遵循Crontab语法。Crontab有六个字段,前五个(1-5)字段定义执行的日期和时间。最后一个字段,即第6个字段,可以是用户名和/或要执行的任务/作业/命令/脚本。

*    *    *    *    *    USER_NAME   COMMAND/SCRIPT-TO-EXECUTE

│   │   │   │    │
│   │   │   │    │
│   │   │   │     |_________   星期几 (0 – 6) (0代表星期天,或使用名称)
│   │   │    |____________ 月份 (1 – 12),*表示每月
│   │    |______________ 日期 (1 – 31),*表示每天
│    |________________  小时 (0 – 23),*表示每小时
|___________________ 分钟 (0 – 59),*表示每分钟

注意

  • 星号(*)用于匹配字段的所有可能值。例如,小时字段中使用星号等同于每小时,而月份字段中的星号等同于每个月。
  • 用户名是可选的(仅在系统crontab文件中可用)

示例:

通过一些示例来了解上述语法

1. 安排cron在每天早上5点执行

0 5 * * * /scripts/job.sh

2. 安排cron每天早上6点和下午6点各执行一次

0 6,18 * * * /scripts/job.sh

3. 安排cron每分钟执行一次

* * * * * /scripts/job.sh

4. 安排cron每周一晚上7点执行

0 19 * * mon /scripts/job.sh

5. 安排cron每15分钟执行一次

*/10 * * * * /scripts/job.sh

6. 安排cron仅在选定的月份执行

* * * feb,jun,oct * /script/job.sh

7. 在3月4日上午7:25运行shell脚本/home/script/backup.sh

25 7 4 3 * /home/script/backup.sh

8. 安排cron每30秒执行一次

由于Crontab中没有秒控制权,但我们可以通过以下两步实现。

  • 首先安排每分钟运行一次的任务。
* * * * * /home/scripts/script.sh
  • 现在让我们使用sleep命令暂停30秒的执行。
* * * * * sleep 30; /home/scripts/script.sh

上述任务将停止30秒钟的执行,然后再次恢复。

Cron配置文件的类型

有两种类型的Cron配置文件:

UNIX/Linux系统Crontab

这需要root权限,因为通常用于系统服务和关键任务。上面语法描述中的第六个字段是要运行的命令的用户名称。它使系统crontab能够像任何用户一样运行命令。

用户Crontab

用户还可以使用crontab命令安装自己的cron作业。在上述语法描述中,第六个字段是要运行的命令,所有命令都是以创建crontab的用户身份运行的。

每个用户都可以拥有自己的crontab文件,尽管这些文件位于/var/spool/cron/crontabs目录中,但它们不应直接进行编辑。我们需要使用crontab命令来编辑或设置自己的cron作业。

它是如何工作的?

cron服务(守护进程)在后台运行并不断检查(每分钟)/etc/crontab文件和/etc/cron.*/目录。它还检查/var/spool/cron/目录。

当分钟、小时和月份字段与当前时间匹配,并且两个日期字段(月份中的日期或星期中的日期)中至少有一个与当前日期匹配时,命令将由cron执行。

基本命令

列出现有的Cron作业

我们可以使用以下命令列出所有的Cron作业,而无需打开crontab配置文件。

crontab -l

如果没有现有的作业,它将返回以下输出。

[姚伟斌@localhost ~]# crontab -l
没有姚伟斌的crontab
[姚伟斌@localhost ~]#

如果用户已经添加了一些作业,它将显示如下。

[姚伟斌@localhost ~]# crontab -l
#编辑此文件以引入由cron运行的任务。
#每个要运行的任务必须通过一行定义
#指示任务何时运行的不同字段
#以及要运行的任务的命令
#
#要定义时间,可以为具体的值提供
#分钟(m)、小时(h)、月(dom)、月(mon),
#和星期几(dow)或在这些字段中使用“*”(表示“任意”)。
#请注意,任务将根据cron系统守护进程的时间和时区开始。
#
#将crontab作业的输出(包括错误)发送到
#电子邮件发送给crontab文件所属的用户(除非重定向)。
#
#例如,您可以在每周的凌晨5点对所有用户帐户进行备份
#0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
#有关更多信息,请参阅crontab(5)和cron(8)的手册页。
#
#m h dom mon dow command
0 */1 * * * /home/account/scripts/updateAccountStatuses.sh
0 */1 * * * /home/account/scripts/reActivateAccountStatus.sh
[姚伟斌@localhost ~]#

Cron表是用户特定的,这意味着您必须使用特定的用户登录才能查看cron表列表。

列出特定用户的Cron

要列出另一个用户的计划作业,请使用选项-u用户)和-l列表)。

crontab -u 另一个用户名 -l

示例crontab -u 姚伟斌 -l

添加/修改Crontab条目

要编辑crontab条目,我们可以使用-e选项,如下所示。

crontab -e

上述命令将打开vi编辑器,您可以在其中指定作业的详细信息并保存文件。保存后,可以使用crontab -l验证是否配置了cron。

为特定用户添加/修改Crontab条目

我们可以使用以下命令为另一个用户编辑crontab

crontab -u 另一个用户名 -e

示例crontab -u 姚伟斌 -e

删除Crontab条目

使用-r参数与Crontab一起使用,可以从crontab中删除完整的计划任务而无需确认。

crontab -r

如果您想在删除计划任务之前进行确认,请使用-i选项与-r一起使用,这将在删除用户的crontab之前提示用户确认。

crontab -i -r
[姚伟斌@localhost ~]# crontab -i -r
crontab: really delete 姚伟斌's crontab?

Crontab特殊字符串

除了我们讨论过的上述语法外,Crontab还提供了八个特殊字符串。这不仅可以节省时间,还可以提高可读性。

特殊字符串 描述
@reboot 启动后运行一次。
@yearly 每年运行一次,即0 0 1 1 *
@annually @yearly相同
@monthly 每月运行一次,即0 0 1 * *
@weekly 每周运行一次,即0 0 * * 0
@daily 每天运行一次,即0 0 * * *
@midnight @daily相同
@hourly 每小时运行一次,即0 * * * *

Crontab特殊字符串示例

1. 按年计划任务的Crontab

@yearly /scripts/greeting.sh

我们可以使用上述命令发送新年祝福,它会在每年的第一分钟执行。

2. 按月计划任务的Crontab

@monthly /scripts/cleanup.sh

我们可以使用上述命令在每个月初执行一些清理活动。

类似地,我们可以使用其他Crontab特殊字符串来实现每周、每日和每小时的目的。

Cron目录

系统管理员可以使用系统范围的cron计划,这些计划位于预定义的cron目录下,如下所示

  • /etc/cron.d
  • /etc/cron.daily
  • /etc/cron.hourly
  • /etc/cron.monthly
  • /etc/cron.weekly

Crontab实时示例

让我们讨论一些实时示例,这些示例通常由系统管理员或IT专业人员使用。

删除空文件和目录

45 0 * * * 姚伟斌 find /tmp -type f -empty -delete

上述cron表达式将从/tmp目录中查找空文件和目录,并删除它们。此任务将在每天的12.45 AM运行。我们需要提及用户名来执行此任务。在上面的示例中,姚伟斌用户执行cron作业。

使用单个cron执行多个任务

* * * * * /home/scripts/backup.sh; /home/scripts/scritp.sh

可以使用分号(;)分隔多个任务/作业,并将其分配给单个cron表达式。

Cron格式化和测试工具

到目前为止,我们已经讨论了使用crontab安排任务的命令和语法。但是,如果您不是系统管理员,您的工作不是经常设置Cron,可能无法记住语法,并且这会导致出错的可能性。不要担心,我们有解决这个问题的方法。

有几个在线可用的Cron格式化工具。

# 1. Cron Job Generator

Cron Job Generator是一个非常用户友好的GUI,您可以在其中指定脚本的分钟数、天数和路径以生成crontab。

让我们以一个实时例子来说明,在星期一到星期五的每5分钟执行/home/processMonitor.sh

因此,我得到了下面的Cron语法,可以通过执行以下命令将其放入我的crontab中:

crontab –e
0,5,10,15,20,25,30,35,40,45,50,55 * * * 1-5 /home/processMonitor.sh

# 2. Crontab生成器

Crontab Generator是另一个方便的工具,可用于生成crontab。使用此工具,您还可以选择是否将cron输出保存到文件或发送到电子邮件。

# 3. Crontab Guru

Crontab Guru是一个简单的在线cron计划表达式编辑器。此外,它还提供了一种有用的监视cron作业的方法。我们只需复制提供的命令并附加到crontab定义的末尾。如果cron作业失败或甚至不启动,您将收到警报电子邮件。

在下面的例子中,作业将在每天、每个月和每个星期的04:05执行。

# 4. CRON测试工具

CRON Tester允许我们测试cron时间/日期定义。可能有这样的情况,我们必须解码现有的cron语法以进行故障排除或进行测试。

为此,我们可以使用这个工具。我们只需将我们的cron表达式复制并粘贴到cron定义字段中,然后选择迭代次数,点击Test来查看它将在哪些日期运行。

让我们检查我们的一个cron表达式4 3 */2 * *,它应该在每两天的03:04(AM)运行。让我们使用cron测试工具来验证它。

结论

我希望以上内容能帮助您更好地理解Crontab和设置cron作业。通过Cron调度作业是Linux管理员执行的众多任务之一。如果您有兴趣学习高级技能,请查看此course

类似文章