封面来源:https://cache.yisu.com/upload/information/20220118/481/171650.jpg

在 crontab 的配置目录中设定计划任务

正如前面一篇文章里面提到的,设置 crontab 最简单的做法是直接使用 crontab -e 命令。其实 Linux 中为我们提供了另一种方式,就是将需要执行的自定义 crontab 文件放入下面的目录内(除了 crontabcron.deny):

其中,crontab 是它默认的配置文件,在软件更新时会被覆写cron.d 允许我们放入自定义的 crontab 文件;其余文件夹或文件内,不同的后缀表示不同的执行时间(hourly - 每小时,daily - 每日,weekly - 每周,monthly - 每月;deny 不讲,它用于记录禁止使用 crontab 的用户,这里用不到)。

特别地,在象征着不同时间执行的文件夹(如 cron.daily)内,不需要使用 crontab 文件,而是直接使用 .sh 脚本。这大大降低了 crontab 的学习门槛与复杂性。

使用 Anacron 运行周期性命令

Anacron(不是 Anaconda)用于保证计划任务始终运行,即使系统关机或休眠。如果因为系统关机或重启导致某个刚好卡在那个时间点/时间段上的计划任务没有执行时,那么在系统就绪后,Anacron 会按照给定的延迟执行计划任务(如果不指定,则不会有延迟执行的情况)。

下面是 Anacron 的一个实例:

重点是在下面的列表。每一个字段的含义如下:

字段名称

含义

period in days

计划任务运行的周期

delay in minutes

延迟执行的时长(或多长时间后才执行)

job-identifier

计划任务的名称(唯一标识符)

command

要执行的命令

上面的 START_HOURS_RANGE 变量会指定计划任务应该运行的时间段。比如说,在上面的图片里,下面列出的所有计划任务必须在 [3, 22] 这个时间段内运行,如果超过了,那只能第二天这个时间段继续了。

systemd 定时

这个功能必须安装 sysstat 软件包(可能需要重启系统):

# Debian/Ubuntu
sudo apt install sysstat

# Fedora/RHEL
sudo dnf install sysstat

# Arch Linux
sudo pacman -S sysstat

这个软件包提供一个名为 sysstat-collect.timer 服务的 systemd 定时器单元,可以做到每隔一段时间收集一次系统统计信息。例如,在它的配置文件 /usr/lib/systemd/system/sysstat-collect.timer 中:

OnCalendar=*:00/10 表示每隔 10 分钟激活该定时器单元(也就是 sysstat-collect.service)。也可以使用一些更加复杂的例子: OnCalendar=2026-2-10 09,14,18,22:30:00,指的是在 2026 年的 2 月 10 日的 9 点、14 点、18 点和 22 点 30 分激活对应的服务单元。相对地,如果觉得每隔多长时间触发的写法很难懂,可以试一试 OnUnitActiveSec=min 选项,它的作用和 OnCalendar=*:00/min 是相同的。

请注意:

  1. 请不要随便修改 /usr/lib/systemd/system/ 目录内的任何配置文件,因为在更新时 systemd 会覆盖所有该目录下的配置更改。建议的做法是将需要修改的配置文件复制到 /etc/systemd/system 目录下,再修改复制后的文件systemd 在解析配置文件时遵循覆盖原则,如果两个目录下出现了同名文件,则会优先解析 /etc/systemd/system 目录下的文件

  2. 修改配置文件后,请使用 systemctl deamon-reload 命令重启守护进程,再使用 systemctl enable --now <unitname>.timer 命令激活定时器单元。

C/C++ 新人开发者,主攻 UE5,业余 Linux 运维