Brian Yao

使用 crontab 管理 Mac 中的定时任务

三行命令我让 Mac 自动定时帮我干活 😂。

crontab(管理者)

什么是 crontab

crontab 是一个专门用于管理 [cron 表达式](#cron 表达式(具体命令) )的工具,它可以实现定时执行任务,而不需要人的参与。它可以根据用户输入的 cron 表达式,自动按照指定的频率执行指定的任务。它简化了定时任务的管理,提高了工作效率。crontab 充当了管理员的角色,它来“发号施令”,Mac 乖乖干活。

crontab 在 Mac 中已经自带,不需要额外安装。

如何管理 crontab

  1. 查看当前正在运行的 cron 任务
# 显示与 cron 相关的进程和命令,以及它们的 PID(进程 ID)
ps -ef | grep cron
  1. 停止 cron 服务
# 暂停所有任务的执行
sudo launchctl unload /System/Library/LaunchDaemons/com.vix.cron.plist
  1. 启用 cron 服务
# 恢复所有任务的执行
sudo launchctl load /System/Library/LaunchDaemons/com.vix.cron.plist

注意:添加定时任务后,不需要先停用后启用 cron 来重新加载它。

  1. 编辑任务
# 完成编辑后,保存并关闭文本编辑器即可
crontab -e
  1. 删除任务(慎用
# 注意!!!这将删除所有 cron 任务,包括重要的系统任务!!!
crontab -r
  1. 列出任务
# 列出当前用户的所有 cron 表达式
crontab -l

cron 表达式(具体命令)

既然 crontab 是管理 cron 表达式 的,那就必须要了解了解 cron 表达式了。

cron 表达式是一个时间计划的字符串,用于指定何时运行命令或脚本。每个字段代表一个时间节点,它们分别是分钟(0-59)、小时(0-23)、日(1-31)、月(1-12)、星期(0-6),它们之间用一个空格分隔。

* * * * *
- - - - -
| | | | |
| | | | +----- day of the week (0 - 6) (Sunday=0)
| | | +---------- month (1 - 12)
| | +--------------- day of the month (1 - 31)
| +-------------------- hour (0 - 23)
+------------------------- minute (0 - 59)

每个字段都代表时间的不同部分,例如,第一个字段代表分钟,第二个字段代表小时,以此类推。

字段可以使用以下符号和值:

  • 星号(*):匹配任何可能的值。
  • 逗号(,):用于分隔多个可能的值。
  • 连接号(-):用于指定一系列连续的值。
  • 正斜杠(/):用于指定间隔时间。例如,*/5 表示每隔 5 个时间单位(分钟、小时等)执行一次命令。
  • 数字:表示具体的时间值。

以下是一些例子:

  • 0 0 * * *:每天午夜执行一次。
  • 0 0 * * 1:每周一午夜执行一次。
  • 0 9-17 * * 1-5:工作日的 9 点到 17 点每隔一小时执行一次。
  • 0 */3 * * *:每隔 3 小时执行一次。
  • */5 * * * *:每隔 5 分钟执行一次。

需要注意的是,cron 表达式的时间是基于系统时区设置的,因此请确保在编写 cron 表达式时考虑正确的时区。

实操一下

定时清理 Downloads 文件夹中下载超过 7 天的文件,直接丢进废纸篓。 这只是个简单的例子,当然你还可以用它来备份文件或数据库、定期清理系统日志文件、定期下载并备份网站数据、定期运行脚本等等。

  1. 打开终端应用程序。
  2. 输入以下命令来打开当前用户的 crontab 文件进行编辑:
crontab -e
  1. 在编辑器中添加以下行:
0 20 * * * find ~/Downloads/* -mtime +7 -exec mv {} ~/.Trash \;

这行代码的含义是:

  • 0 20 * * *:cron 表达式,表示该任务将在每天晚上 8 点运行。星号(*)表示任何可能的值,因此这个表达式将匹配每一天。
  • find ~/Downloads/*:使用 find 命令查找 Downloads 文件夹中的所有文件。
  • -mtime +7find 命令选项之一,表示只匹配文件的修改时间比 7 天更早的文件。+7 表示查找修改时间比 7 天更早的文件,而不是正好 7 天。
  • -exec mv {} ~/.Trash \;find 命令选项之一,表示将找到的每个文件执行 mv 命令。{} 表示当前查找到的文件名,\; 表示命令结束。这个命令将找到的文件移动到当前用户的废纸篓中(~/.Trash)。
  1. esc 键,输入 :wq,按下回车保存。

试了一下 Linux 中也适用。

最后,希望本文能帮助到大家,over🎉~

参考资料