Linux / 如何使用 Crontab

在 Linux 中,使用 crontab 可以在指定时间重复执行命令或脚本。使用 crontab -e,你可以编辑当前用户的计划任务,在一行中输入五个时间字段和要执行的命令。

cron 和 crontab 的区别

cron 是一个定期检查并执行计划任务的服务。crontab 是记录执行时间和命令的任务列表,通常为每个用户单独管理。本文中的示例基于 Debian 和 Ubuntu 系列的典型用户 crontab。安装方法、服务名称和支持的功能可能因不同的发行版和 cron 实现而有所不同。

计划任务以对应 crontab 所有者的权限执行。如果需要当前用户不具备的权限,请谨慎设置管理员和执行账户,并且不要创建权限过大的任务。在计算机关闭或 cron 服务停止的时间安排的任务将不会被执行。

检查和编辑 Crontab

在终端中,使用以下命令查看当前用户的计划任务。如果出现提示说没有列表,说明该用户尚未拥有 crontab。

crontab -l

要添加或修改任务,请运行以下命令。第一次运行时可能会出现编辑器选择界面。保存文件并退出编辑器后,cron 会检查语法并安装新的列表。如果出现错误,请根据提示再次编辑,并确认显示安装消息。

crontab -e

管理员账户的计划任务与当前用户的任务是分开的。仅在需要管理权限时,使用 sudo crontab -e 编辑 root 的列表,并使用 sudo crontab -l 检查它。不要混淆这两个列表。

要删除单个任务,请运行 crontab -e,只删除该任务所在行并保存。crontab -r 会删除当前用户的全部计划任务,所以使用前请检查列表,并在必要时备份到安全位置。可以用 crontab -l > ~/crontab-backup.txt 进行备份,如果需要恢复,可以用 crontab ~/crontab-backup.txt 重新安装整个文件。恢复操作会覆盖当前列表,所以请先检查是否有任何更改。

计划时间的格式

用户的 crontab 中的每个任务由五个时间字段组成,后面跟着命令。在系统 crontab 文件中,如 /etc/crontab 或 /etc/cron.d/,会在时间字段和命令之间添加一个额外的执行用户字段,因此不要照搬下面的格式。

minute hour day-of-month month day-of-week command
字段 允许范围 含义
分钟 0–59 分钟
小时 0–23 小时
日期 1–31 日期
月 1–12 月份
星期几 0–7 星期几。0 和 7 都是星期天

* 指该字段中的所有值。逗号表示多个值 (10,20),连字符表示一个范围 (1-5),斜杠表示范围内的间隔 (*/10)。例如,分钟字段中的 */10 意味着每小时的 0、10、20、30、40、50 分钟。间隔在每个字段内解释,因此它们不总是保证基于经过时间的相同间隔。

如果同时限制了日期和星期几,Debian cron 将在符合任一条件的日子运行。例如,0 4 1 * 1 会在每个月的 1 日和每个星期一的凌晨 4 点运行,而不仅仅是在 1 日恰好是星期一的情况下。您可以在系统的 man 5 crontab 或 Debian cron crontab 格式文档 中查看详细格式。

定时任务示例

在以下示例中,将 /home/user/bin/backup.sh 替换为实际脚本的绝对路径。用户必须能够访问该脚本和目标文件,如果直接运行脚本,还需要执行权限和正确的解释器指定。首先,用相同的账户在终端运行以验证结果。

0 4 * * * /home/user/bin/backup.sh
0 4 * * 1-5 /home/user/bin/backup.sh
*/10 4 * * * /home/user/bin/backup.sh

第一行每天上午4点运行,第二行周一至周五上午4点运行,第三行从上午4点到4:50,每隔10分钟运行一次。这些示例是独立的计划。输入所有内容后,每行的所有任务都将被注册。

安全地注册和测试作业

在练习时,不使用实际备份,而尝试使用在当前用户主目录中留下记录的任务。

  1. 运行 crontab -e,添加以下单行,然后保存并退出。日期和时间将每分钟追加到文件中。
* * * * * /bin/date >> "$HOME/cron-test.log" 2>&1
  1. 运行 crontab -l 检查已安装的条目。1–2分钟后,运行 cat ~/cron-test.log 并检查是否已添加记录。
  2. 确认后,运行 crontab -e,只删除练习条目并保存。检查内容后,可以删除日志文件。

如果练习不起作用,请检查 cron 服务是否已安装并正在运行。在典型的 Ubuntu cron 包中,可以使用 systemctl status cron 查看状态。服务名称和日志位置因发行版而异,在使用 systemd 日志的 Ubuntu 环境中,可以使用 journalctl -u cron 检查服务日志。

当它无法运行时要检查的事项

cron 可能在与登录 shell 不同的环境中运行。尽可能使用绝对路径指定命令和脚本,并在脚本中明确定义所需的环境变量和工作目录。为了检查错误,你还可以将任务的输出和错误重定向到用户可访问的日志文件中。由于日志可能包含敏感信息,请注意访问权限和保留期限。

检查系统时间和时区是否如预期,执行账户是否可以访问文件,以及是否存在重叠执行的可能性。在命令中使用的 % 会被 cron 特殊处理,因此如果要字面传递它,通常需要用 \% 转义。请查阅所使用的 cron 文档以了解确切行为。