跳到内容

cronie - 定时任务

先决条件

  • 运行 Rocky Linux 的计算机
  • 了解如何在命令行环境中使用您喜欢的编辑器更改配置文件(本文将使用 vi
  • 您已经了解 bash、python 或其他脚本或编程工具的基本知识,并希望自动运行脚本
  • 您已通过 SSH 连接到您的计算机(可以是 root 用户或 UID 大于 1000 的普通用户)

cron 简介

GNU/Linux 提供 cron 系统,这是一个基于时间的 cron 作业程序,用于自动执行流程。它并不难,但功能强大。您想让脚本或程序每天下午 5 点运行吗?cron 可以做到。cron 有不同的分支(或变体),它们具有相同的功能。本文档使用 cronie,版本为 1.5.2。点击 这里 找到最新版本并更新日志。

cronie 描述

  • cronie - 包名称,Rocky Linux 默认包含 cronie
  • crontab - 用于维护每个用户的 crontab(任务计划)的命令
  • crond.service - cronie 的守护进程,您可以通过 systemctl start | restart | stop | status 来管理守护进程
  • /etc/crontab - 将 cron 作业分配给不同的用户,通常我们更习惯使用 crontab -e。例如,如果您当前以 root 用户身份登录,键入 crontab -e,您将在保存后看到文件 /var/spool/cron/root 中的特定 cron 作业。
  • /var/log/cron * - cronie 的日志,默认情况下,它会进行日志轮转,并以日期后缀结尾。这里,它意味着通配符。
  • anacron - cronie 的一部分。有关 anacron 的更多信息,请参见 anacron-automation 命令.

crontab 命令

crontab 是在安装 cronie 包后获得的命令。与 anacron 相比,它更适合 24/7 运行的服务器。crontab 的常见选项是

-e # edit crontab scheduled tasks
the -l # View crontab task
-r # delete all the current user's crontab tasks

使用 cronie

将命令或脚本写入此文件可以使它们在不同的时间运行。但是,通常我们更习惯使用 crontab -e

shell > cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0-59)
# | .------------- hour (0-23)
# | | .---------- day of month (1-31)
# | | | .------- month (1-12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0-6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
参数意义值范围
第 1 个*小时的第一分钟0-59
第 2 个*一天中的小时0-23
第 3 个*一个月中的日期1-31
第 4 个*一年中的月份1-12
第 5 个*一周中的日期0-7 (0 和 7 都表示星期日)

在下面的示例中,假设您以 root 用户身份执行此操作,键入以下内容

  • crontab -e 将显示 root 用户的定时任务。如果您使用 vi 作为默认系统编辑器,请按 I 键进入插入模式。
  • "#" 表示这是一行注释。
# Nightly 10:00 backup system
00 22 *  *  * /usr/local/sbin/backup
  • 输入此行后(再次假设 vi 是系统编辑器),请按 Esc 退出插入模式
  • 使用 Shift+:+w+q+! 保存并退出您的文件(显示在编辑器的底部)

脚本将在每天晚上 22:00 运行。这是一个简单的示例。如果您需要更复杂的东西,事情可能会变得更加复杂。

注意

脚本需要具有执行权限(chmod +x),cronie 才能运行它。

复杂选项

到目前为止讨论的内容是简单的选项,但是更复杂的定时任务呢?

# Suppose you want to run every 10 minutes backup script (may be impractical, however, it is only an example!) Throughout the day. To this end, the following will be written:
* /10 *  *  *  * /usr/local/sbin/backup
#What if you only want to run a backup every 10 minutes on Monday, Wednesday, and Friday? :
* /10 *  *  * 1,3,5 /usr/local/sbin/backup
# In addition to Saturdays and Sundays, once every 10 minutes, every day, how to back up?
* /10 *  *  * 1-5 /usr/local/sbin/backup
特殊符号意义
*代表任何时间。例如,第一个 * 表示任何分钟,第二个 * 表示任何小时
,表示不连续时间,例如 0 8,12,16 * * *,这意味着该命令将在每天的 8:00、12:00 和 16:00 运行一次
-表示一个连续的时间范围,例如 0 5 * * 1-6,这意味着一个命令将在周一到周六的每天早上五点运行
*/n表示间隔运行的频率,例如 */10 * * * * 表示每 10 分钟运行一次

注意

cronie 可以识别的最小时间单位是 1 分钟;例如,当使用 30 4 1,15 * 5 command 时,它将导致命令在每个月的 1 日和 15 日以及每个周五凌晨 4:30 运行;一些脚本或命令的输出信息将阻止定时任务的执行,需要进行输出重定向,例如:*/10 * * * * /usr/local/sbin/backup &> /dev/null

问答

  1. /etc/crontab 和 crontab -e,这两种方法之间有什么区别?crontab -e 不需要指定用户(默认情况下使用当前登录的用户),而 /etc/crontab 需要指定用户。
  2. 如果指定的命令或脚本未正确运行,该怎么办?检查 /var/log/cron* 文件,使用 journalctl -u crond.service 检查有关守护进程的信息,以及脚本是否具有 x 权限等,以进行故障排除。
  3. 除了 cronie 之外,还有哪些 cron 变体?fcron,最新版本为 3.3.0(开发版,2016-08-14)。cronsun,最新版本 0.3.5(2018-11-20)。

总结

对于 Rocky Linux 桌面用户或系统管理员来说,cronie 是一个强大的工具。它允许自动化任务和脚本,因此您不必记住手动运行它们。尽管基本知识并不难,但任务可能很复杂。有关 crontab 的更多信息,请访问 crontab 手册页。您也可以在互联网上搜索“crontab”,它会提供很多搜索结果,帮助您微调 crontab 表达式。

作者:田思礼

贡献者:史蒂文·斯宾塞,甘纳·齐尔诺娃