使用 cron 自动执行 Linux 系统任务
即使是最老练的系统管理员也可能会惊讶地发现没有 Linuxcron
命令。cron 守护进程 ( crond
) 是一个系统管理的可执行文件,它在内存中运行,用户可以使用它来安排任务。与服务一起工作的用户命令cron
是crontab
(cron table)。该crontab
文件是一个简单的文本文件,它指示cron
守护进程在特定时间或间隔执行任务。任何用户都可以cron
在系统上安排任务或作业。任务在创建它的用户帐户下运行。换句话说,如果您创建任务cron
,它将使用您的用户帐户的权限运行。系统上的任何用户(包括 root 用户)都是如此。
使用 cron
您可以发出man crontab
命令来查看所有可能的选项,但通常有两个选项适用于大多数用户:(-l
列表)和-e
(编辑)。
要查看已配置任务的列表cron
,请使用:
$ crontab -l
no crontab for khess
我还没有cron
运行任何任务。要创建一个任务,我需要编辑我的crontab
文件:
$ crontab -e
注意:创建条目时无需任何文件名或指定crontab
。每个用户只有一个crontab
文件,您可以将所有任务添加到该文件中。
编辑器没有什么特别之处crontab
,只是如果您没有使用VISUAL
或EDITOR
环境变量定义特定的编辑器,那么您的编辑器可能是 vi
或vim
。
注意:如果您不知道如何使用vi
或vim
,请参阅我的文章vi编辑器简介。
按I 键进入 INSERT 模式并开始设置 crontab 条目。该crontab
文件具有特定的语法。参见下图:
使其发挥作用
从图中可以看出,条目的位置有意义,并且条目之间用空格分隔。星号 ( *
) 表示每个或全部,如每分钟或所有小时、每天等等。换句话说,该图当前显示的是crontab
每天每分钟运行的脚本条目。这种做法虽然很少见,但在某些情况下确实存在。但是,对于大多数cron
任务,您需要更具体。
注意:在设置cron
任务之前,请运行您的脚本或命令以查看是否存在权限或路径问题。
提供脚本中任何可执行文件的完整路径是一种很好的做法。同样,您也应该在条目中提供可执行文件或脚本的完整路径crontab
。
例如,如果您有一个脚本需要dmesg
每天下午 1 点通过命令创建一次文件,则您的输入如下所示:
0 13 * * * /usr/bin/dmesg > ~/dmesg.txt
如果你想通过电子邮件将此文件发送给你自己,你可以在你的文件中添加额外的条目crontab
:
2 13 * * * /usr/bin/mail khess@domain.com < ~/dmesg.txt
像退出vi
或退出默认编辑器一样退出文件并保存。您无需执行任何特殊操作即可启用此编辑 crontab
。cron
守护程序会自动检查目录中是否存在条目/var/spool/cron
。例如,我的crontab
是/var/spool/cron/khess
并包含上述两个条目。
守护进程cron
以 root 身份运行,因此它可以读取目录的内容,因为只有 root 用户才有权访问此目录。其他用户访问 /var/spool/cron
和读取 crontab
系统上其他用户的条目将是一种严重的安全违规行为。
更多示例
对于以下示例,假设您有一个脚本,backup.sh
,您想要在系统上安排它。您已将所有系统脚本放在 中/etc/scripts
,这是只有 root 才有权访问的目录。
要安排备份脚本每天晚上 2 点运行,请打开 root 用户的crontab
:
$ sudo crontab -e
然后输入以下内容:
0 2 * * * /etc/scripts/backup.sh
保存并退出文件。
让我们尝试一些更高级的东西。安排备份脚本每周一凌晨 2 点运行。现在,条目是什么样子crontab
的?请参考crontab
语法图获取提示:
0 2 * * 1 /etc/scripts/backup.sh
1
第五列指示在cron
星期一运行该脚本。
不要每周一运行特殊备份脚本,而是在每月 15 日运行它:
0 2 15 * * /etc/scripts/backup.sh
如果备份脚本仅备份单个关键任务目录怎么办?您希望每 15 分钟备份一次该目录的内容。以下是该脚本的样子,但不是 100% 直观:
*/15 * * * * /etc/scripts/backup.sh
每 15 分钟设置一次的传统方法如下:
0,15,30,45 * * * * /etc/scripts/backup.sh
同样,如果您只想在周一到周五运行脚本,您的输入将更改为:
*/15 * * * 1,2,3,4,5 /etc/scripts/backup.sh
如您所见,cron
一旦您理解了语法,调度就很容易了。您可能遇到的唯一真正障碍cron
是路径、权限和时间。您必须考虑脚本需要多长时间才能执行并产生输出,然后再调度依赖于它的另一个进程。回顾脚本dmesg
,您会发现您需要知道命令dmesg
需要多长时间才能完成处理并写入dmesg.txt
文件,然后才能调度下一个命令,即将dmesg.txt
文件通过电子邮件发送给您自己。
总结
通常,系统管理员和其他用户在 Linux 系统上自动化进程的方式是创建脚本来执行创建文件、移动文件、通过电子邮件发送信息、执行备份、报告备份等功能。当您安排这些相同的脚本时,cron,
您就在系统上创建了真正的自动化。很少有重复性任务不能使用cron
和脚本自动执行。如果您在自动执行需要密码或交互式会话的任务时遇到问题,请使用expect
脚本来自动化这些任务。如果您不知道expect
,请关注“启用 Sysadmin”以获取有关该主题的未来帖子。
除了 之外,还有其他方法可以在 Linux 中实现自动化cron
。例如,at
可以使用 命令在特定时间运行作业。您还可以使用 systemd(通过systemd 计时器系统)将任务设置为在特定时间运行。
[想要试用 Red Hat Enterprise Linux? 立即免费下载。]
本网站表达的观点均为作者本人观点,而非作者所在雇主或 Red Hat 的观点。本网站发布的内容为社区贡献,仅供参考,并非且不旨在作为 RED HAT 文档、支持或建议。