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 天前最后修改的普通文件之外的任何内容。 然后它会删除它找到的所有此类文件。

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

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

如果您正在处理写入日志或存储缓存数据的项目,那么如果您要删除文件以清除磁盘空间,这种方法可能至关重要。 虽然上述 example 是一种快速而肮脏的方法,您应该使用诸如 时间手表,如果它可用。

2. 每天两次数据库备份

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

crontab -e

此 crontab 应包含特定于您的用户帐户的任务。 想象一下,您正在处理一个涉及填充 MySQL 数据库的项目。 您可以使用 mysql转储 用于创建整个数据库的 SQL 转储的工具。 通过重定向其输出,您可以进行简单的预定数据库备份。

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

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

注意上面的方法 example 使用命令替换根据当前的 Unix 时间戳构建文件名。 因为 % 符号对 cron 有特殊含义,命令需要用前面的反斜杠对其进行转义。

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

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

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

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

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

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

脚本本身使用 curl 程序来获取给定 URL 的 HTTP 状态代码。 如果状态指示不是成功,则脚本会在输出中写入一条消息。

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

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

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

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

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

[email protected]

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

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

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

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

MAILTO=""

5.在特定时间广播消息

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

  • 多个值以逗号 (,)
  • 用连字符 ()
  • 正斜杠后的步长值 (/)

因此对于 example,如果您想在工作时间每小时两次(但每三个小时)向所有登录用户发送消息,则如下所示就足够了:

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

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

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

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

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

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