使用 Linux cron 命令调度任务

尝试这种方法,直接从 Linux 命令行解决具有挑战性的调度问题。
8 位读者喜欢这篇文章。
Team checklist

在我的 Linux 早期探索中,我开始欣赏操作系统的众多命令行实用程序以及它们简化日常任务的方式。例如,在我的 Windows 服务器上备份应用程序通常需要昂贵的附加软件包。相比之下,tar 命令使备份 Linux 变得相对容易,而且它功能强大且可靠。

然而,在备份我们学区的电子邮件系统时,我面临着不同的挑战。备份不能在工作日或傍晚进行,因为人们正在使用该系统。备份必须在午夜之后进行,并且需要可靠。我习惯了 Windows 任务管理器,但我在 Linux 上要用什么呢?那时我了解到了 cron。

在 Linux 上使用 cron 调度任务

Cron 是一个守护进程,用于自动执行计划的命令。学习如何使用 cron 需要一些阅读和实验,但很快我就开始使用 cron 来关闭我们的电子邮件服务器,将数据备份到压缩的 tar 文件中,然后在凌晨 3 点重启电子邮件服务。

cron 作业的命令存储在 Linux 系统上的 crontab 文件中,该文件通常位于 /etc/crontab。使用 $ crontab -l 显示 crontab 文件的内容。

使用 $ crontab -e 编辑 crontab 文件。

某些系统默认使用 Vi 编辑器 进行 cron 编辑。您可以使用 环境变量 覆盖此设置。

$ EDITOR=nano crontab -e

这允许您使用 nano 编辑器 编辑您的个人 crontab 文件(如果您还没有,系统会自动为您创建一个)。

所有 crontab 命令都有用星号表示的参数,直到您插入一个整数值。第一个代表分钟,然后是小时、月份中的日期、年份中的月份,最后是星期几。

注释以井号开头。Cron 会忽略注释,因此它们是为您自己留下关于命令做什么以及为什么重要的注释的好方法。

一个 cron 作业示例

假设您想每周一上午 10 点使用 clamscan 扫描您的主目录以查找病毒和恶意软件。您还想每周二上午 9 点备份您的主目录。使用 cron 和 crontab 文件可以确保您的系统维护每周都会进行,无论您是否记得运行这些实用程序。

编辑您的 crontab 文件以包含以下内容,使用您自己的用户名而不是 “don”(我的用户名)

# Scan my home directory for viruses
0 10 * * 1 clamscan -ir /home/don
# Backup my home directory
0 9 * * 2 tar -zcf /var/backups/home.tgz /home/don

如果您使用的是 nano 编辑器,请使用 Ctrl+O 保存您的工作以写出文件,并使用 Ctrl+X 退出编辑器。编辑文件后,使用 crontab -l 列出您的 cron 文件的内容,以确保它已正确保存。

您可以为您系统上需要的任何作业创建 crontab 作业。这充分利用了 cron 守护进程。

从 Linux 命令行进行调度

cron 最难的部分是为那些前导星号想出正确的值,这已不是什么秘密。有一些网站,例如 crontab.guru,可以将 cron 时间动态翻译成人类可读的翻译,Opensource.com 还有一个 cron 速查表,您可以下载它来帮助您理清思路。

此外,大多数现代 cron 系统都具有常用值的快捷方式,包括

  • @hourly :每小时运行一次 (0 * * * *)
  • @daily :每天运行一次 (0 0 * * *)
  • @weekly :每周运行一次 (0 0 * * 0)
  • @monthly :每月运行一次 (0 0 1 * *)
  • @reboot :重启后运行一次

还有 cron 的替代方案,包括 anacron,用于您想要定期运行但不按照特定计划运行的作业,以及用于一次性作业的 at 命令

Cron 是一个有用的任务调度系统,它像编辑文本一样容易使用。试试看!

标签
User profile image.
教育家、企业家、开源倡导者、终身学习者、Python 教师。教育心理学硕士,教育领导学硕士,Linux 系统管理员。

2 条评论

简单但方便!

非常好。让我添加一些不太明显的特殊情况。

匹配工作日
0 7 * * 1-5 command

匹配偶数分钟
0-59/2 * * * * command

匹配奇数小时
0 1-23/2 * * * command

匹配新季度开始的月份
0 7 1 1-12/4 * command

匹配第二个星期三
0 7 14-20 * * [ ```$(date +%a) = Wed ] && command

匹配当月的最后一天
0 7 * * * [ `` $(date -d 1day +\%d`) = 01 ] && command

匹配当月的最后一个星期六
0 7 * * * [ `` $(date -d 8days +\%d`) -lt 8 -a `$(date +\%a) = Sat ] && command

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.