5 个帮助您自动化 Linux 任务的 Crontab 示例

cron 程序自动执行 Linux 上的其他程序。 Cron 是一个守护进程,它持续运行并根据给定的时间表启动其他程序。几个不同的文件定义了这个时间表。它们单独称为 crontab。

Cron 可以调度任何 Unix 命令或任务。有时,您会想要使用一个简单的命令。其他时候,您需要编写一个脚本来执行完整的任务。 Cron 适用于任何一种方法。它还支持复杂的调度规则和灵活的脚本输出处理方式。

无论您是执行简单的用户任务还是全面的系统管理,都必须使用实际示例了解 cron 的工作原理。

1. 使用系统范围的 Crontab 清理 /tmp

/tmp目录是供系统的任何程序或用户通用的临时位置。许多 Unix 系统在启动时会删除 /tmp 目录中的旧文件。其他人经常使用 cron 安排此操作。

但是,如果您想对这个过程进行自定义控制,或者想将其应用到不同的目录,那么设置一个快速的 cron 任务是一种简单的方法。

这是清理 /tmp 或您选择的任何其他目录的一种方法:

 1 3 * * * /usr/bin/find /tmp -type f -atime +10 -delete

每天三点零一分,cron 都会执行这个命令。它使用find 命令在 /tmp 目录中搜索文件。它过滤掉除了至少 10 天前最后修改的正常文件之外的任何内容。然后它会删除它找到的所有此类文件。

您应该使用sudo crontab -e将这样的命令添加到全局 crontab,例如/etc/crontab或 root 的 crontab。该命令需要以 root 身份运行,以便它可以删除 /tmp 中的文件,而不管它们的所有者是谁。

请注意,此示例指定了 find 命令的完整路径。 Cron 使用基本的PATH 设置来搜索可执行文件,因此如果命令位于标准位置(如/usr/bin ),则这不是必需的。如果您喜欢这种方法,您可以在 crontab 本身中指定一个替代 PATH。但是对命令使用完整路径会更有弹性。

如果您正在处理写入日志或存储缓存数据的项目,如果您要删除文件以清除磁盘空间,这种方法可能至关重要。虽然上面的示例是一种快速而肮脏的方法,但您应该使用诸如tmpwatch 之类的命令(如果可用)。

2. 每天两次数据库备份

从现在开始,让我们专注于您可以通过本地 crontab 管理的特定于用户的任务。您可以使用以下命令编辑当前用户的 crontab:

 crontab -e

此 crontab 应包含特定于您的用户帐户的任务。假设您正在从事一个涉及填充 MySQL 数据库的项目。您可以使用mysqldump工具创建整个数据库的 SQL 转储。通过重定向其输出,您可以轻松地安排数据库备份。

 30 4 * * * /usr/local/mysql/bin/mysqldump --login-path=local --databases albums > /tmp/album-db.$(date +%s).sql

默认情况下,cron 通过电子邮件将输出(包括错误)发送给 crontab 文件所属的用户。但是您可以使用> 文件名表示法,以与从命令行相同的方式重定向输出。

请注意上面的示例如何使用命令替换基于当前 Unix 时间戳构建文件名。因为%符号对 cron 有特殊意义,所以命令需要用前面的反斜杠对其进行转义。

3. 使用自定义脚本检查站点正常运行时间

您可能已经注意到,上一个示例中的命令长得令人不舒服。值得庆幸的是,没有什么可以阻止您将命令保存在脚本中并通过 crontab 执行该脚本。这是一个每分钟运行一个脚本的示例:

 * * * * * /Users/bobby/bin/site-monitor.sh

请注意,理论上,您可以将HOME变量或波浪号扩展用于更短的命令:

 * * * * * ~/bin/site-monitor.sh

您可能会选择避免这样做,以防 cron 停止支持它。使用完整路径并没有什么真正的危害,而且可以说它更具可读性。

脚本本身使用 curl 程序来获取给定 URL 的HTTP 状态代码。如果状态指示除成功之外的任何其他内容,脚本将向输出写入一条消息。

如前所述,cron 将通过电子邮件将此输出发送给我们。让 cron 中的命令在成功时不产生输出是很有用的。

 #!/bin/bash
STATUS=`curl -s -o /dev/null -I -w "%{http_code}" http://example.com/`
if [ "$STATUS" != "200" ]
then
echo "site appears to be down"
fi

4. 通过电子邮件的磁盘空间报告

如果要更改 cron 的默认电子邮件发送行为,可以使用MAILTO环境变量。 Cron 支持一些可以在 crontab 文件中设置的变量。然后,Cron 将这些变量应用于后面每个命令的环境。

要设置备用目标电子邮件地址,请使用以下格式:

 [email protected]

如果需要,您需要在设置为发送外部电子邮件的机器上运行它。这是一个示例,它将向同一台计算机上的另一个用户发送电子邮件。它每天运行两次,分别在 12:00 和 23:00。 df命令显示可用磁盘空间,因此此 crontab 条目委托检查磁盘空间是否正常的任务:

 MAILTO="sarah"
0 12,23 * * * /bin/df -h

生成的电子邮件将如下所示:

请注意,cron 添加了自己的自定义电子邮件标头。这些对于调试很有用。您还可以使用空字符串禁用 cron 的默认电子邮件行为:

 MAILTO=""

5. 在特定时间广播消息

其他示例使用相当简单的调度,但 cron 支持用于时间规范的强大语法。它不仅处理精确匹配,还处理:

  • 以逗号 ( , ) 分隔的多个值
  • 用连字符 ( ) 指定的范围
  • 正斜杠 ( / ) 后的步长值

因此,例如,如果您想向所有登录用户发送一条消息,在工作时间内每小时发送两次,但每三个小时发送一次,则类似以下内容就足够了:

 0 15,45 9-17/3 ? * * * echo 'Enjoy your work!' | wall

此命令将在每小时 15 分钟和 45 分钟后执行,在上午 9 点到下午 5 点之间每三个小时执行一次。 wall 命令向每个登录的终端用户发送一条消息。

您甚至可能会发现 cron 提供比日历应用程序更灵活的日程安排。某些变体允许您指定要在一个月的第二个星期五或距某个日期最近的工作日执行的命令。

Cron 可以自动化多种类型的 Linux 任务

这是 cron 可以帮助您自动化的任务类型的一小部分。可能需要一些时间来适应复杂的语法,但 cron 是一个强大的实用程序。您可以将 cron 用于系统范围的任务和特定于用户的任务。

cron 具有复杂的调度语法,功能强大,但您可能应该有一个很好的参考手册。 Crontab 允许注释,因此您可能希望在您的注释行中包含注释行以记录时间字段。