帮助您自动化 Linux 任务的 5 个 Crontab 示例
想要了解如何在 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 或使用 sudo crontab -e 的 root crontab。该命令需要以 root 身份运行,以便它可以删除 /tmp 中的文件,无论这些文件的所有者是谁。
请注意,此示例指定 find 命令的完整路径。 Cron 使用基本的 PATH 设置来搜索可执行文件,因此如果命令位于标准位置(例如 /usr/bin),则实际上没有必要。如果您喜欢这种方法,您可以在 crontab 本身中指定替代路径。但使用命令的完整路径更具弹性。
如果您正在开发一个写入日志或存储缓存数据的项目,并且要删除文件以清理磁盘空间,这种方法可能至关重要。虽然上面的示例是一种快速而肮脏的方法,但您应该使用诸如 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 程序来获取给定网址的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 将这些变量应用到后面每个命令的环境中。
要设置备用目标电子邮件地址,请使用以下格式:
MAILTO=user@example.com
您需要在设置为根据需要发送外部电子邮件的计算机上运行此程序。这是一个向同一台计算机上的另一个用户发送电子邮件的示例。每天运行两次,时间为 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 允许注释,因此您可能需要在您的 Crontab 中包含注释行来记录时间字段。