跳至内容

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-自动化命令

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
参数 含义 值范围
第一个* 小时内的分钟 0-59
第二个* 一天中的小时 0-23
第三个* 月份中的日期 1-31
第四个* 一年中的月份 1-12
第五个* 一周中的日期 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 (dev, 2016-08-14)。cronsun,最新版本 0.3.5 (2018-11-20)。

总结

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

作者:李天赐

贡献者:Steven Spencer, Ganna Zhyrnova