Linux/Unix中,我们可以使用cron命令自动运行和计划任务,你可以一次或定期执行任务。“Cron”广泛用于定期执行重复性工作(使用名为“crontab”的命令运行),“at”程序用于在特定时间段内执行一次任务。Crontab为所有用户维护单独的crontab文件。这些自动化的工作对许多使用Linux服务器的管理员来说是非常有用的。
一般来说,“crontab”文件用于备份、更新系统、同步服务器等任务。cron的一个重要优点是,你不需要详细了解它,只需要知道如何使用它作为设置cron作业的一部分。
本教程将指导你使用crontab的各种选项。下文中所有crontab的例子都在RHEL/CENTOS 7.6上测试过。
首先,让我们看看crontab的基本语法和表达式:
- Minute hour Day-of-Month Month-of-Year Day-of-Week Command
- 0-59 0-23 1-31 1-12 0-6 command / script
Crontab总共有6个字段。第1-5个字段是日期和时间,第6个字段可用于任何可执行的Linux命令或脚本。
注意:时间字段采用24小时格式。
1. 如何在每天的特定时间执行cronjob?
要把任务添加到crontab中,我们应该使用'-e'选项。一旦添加了任务,vi编辑器将打开crontab配置文件,然后使用’:wq!'保存并关闭该文件。
- # crontab -e
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh >/dev/null 2>&1
注意:在这里,我们有一个名为“rsync_svnbackup.sh”的bash脚本,每天(周一到周日)凌晨1点30分执行。一旦任务被执行,Cron就会向特定的用户发送一封关于任务状态的通知邮件,无论是成功还是失败。如果不需要通知,那么我们可以在脚本的最后使用>/dev/null 2>&1命令来禁用它,它将使所有的通知无效。
2. 如何列出crontab任务?
使用下面的命令列出我们添加到crontab配置文件中的任务。这里,我们使用的是root账户。
- # crontab -l
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh >/dev/null 2>&1
注意:'-l'是列出当前登录的用户的crontab列表的选项。
3. 如何以其他用户身份修改cronjob?
比方说,我想以另一个名为“linuxteck”的用户修改crontab任务。
- # crontab -u linuxteck -e
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh
注意:上述命令只能由高权限用户执行,比如“root用户或超级用户”,或者被赋予了特权的普通用户。这里‘-u’代表用户名,‘-e’选项代表编辑。
4. 如何列出其他用户的crontab任务?
下面的命令将显示其他用户(linuxteck)的任务列表。
- # crontab -u linuxteck -l
- 30 01 * * * /usr/scripts/rsync_svnvmback.sh
注意:记住,只有root/超级用户可以执行上述命令,或者具有相同权限的普通用户。
5. 如何配置每分钟运行的cronjob?
这个要求在实际中很少使用,但也有一些用例。举个例子:如果你使用rsync脚本/命令从线上服务器同步备份,这样以来,备份服务器将每分钟从线上服务器获得更新。
- # crontab -e
- * * * * * /usr/scripts/rsync_svnvmback.sh
注意:上述crontab任务(rsync_svnvmback.sh)将在全年每小时中的每一分钟运行。
6. 如何配置一个每天运行两次的cronjob?
这意味着一条命令/脚本在一天内将被执行两次。举个例子:一些公司在早上和晚上进行数据库备份,比方说早上6点和晚上8点。
- 00 06,20 * * * /usr/scripts/mysqldump.sh >/dev/null 2>&1
注意:在小时字段使用了逗号分隔值。这个脚本将在每天早上6点和晚上8点执行。正如第一个例子中提到的,用'>/dev/null 2>&1'命令来禁用通知。
7. 如何配置每10分钟运行一次的cronjob?
下面的任务可以连续每10分钟执行一次命令/脚本。
- */10 * * * * /usr/scripts/rsync_svnvmback.sh
注意:你可以根据你的要求调整为5分钟或10分钟等进行测试。
8. 如何配置特定日期执行的cronjob?
使用下面的配置,我们可以在特定的日子里执行cronjob。例如:你可以只在周五和周日的晚上11点运行备份脚本。
- > 0 23 * * fri,sun /usr/scripts/rsync_svnvmback.sh
注意:在这里我使用了日期的简称并用逗号来分隔,而不是数字,这样用户就很容易读懂。如果你使用数字,一些系统上是0-6,一些是1-7。因此,许多初学者在配置“星期天”时感到困惑,到底该使用0还是7。实际上,‘0和7’都代表星期天。
9. 如何配置在特定月份运行的cronjob?
使用下面的配置,我们可以为在特定月份执行cronjob,例如:该脚本应该只在1月和7月的晚上11.00执行。
- 0 23 * jan,jul * /usr/scripts/rsync_svnvmback.sh
注意:crontab语法中第四字段是月份的名称。如果不止一个月份执行,则使用逗号来分隔。
10. 如何在一行中连续运行多个cronjob?
正常情况下,我们为不同的任务、不同的时间一个一个地添加crontab任务。实际上,我们可以在一个特定的时间添加多个任务,一个接一个地执行。例如:我有多个命令/脚本要在我的服务器上执行,即备份数据库、备份应用程序文件,然后压缩数据库和文件,并将这些tar文件推送到备份位置,然后从服务器上删除这些tar/archive文件,然后清理tmp文件,等等。这种情况下,如果我们同时执行所有的脚本,将极大地影响服务器的性能。例如,可能导致服务器的磁盘空间用完,内存、CPU和带宽的占用率会大幅升高,有时甚至使服务器失去响应。
这种情况下,我们可以在crontab中使用下面的方式,让脚本一个接一个地执行,例如:如果我们有5组脚本要在早上1点运行,那么第一个脚本将在1点开始运行,一旦完成,第二个就立即开始,以此类推。
常规做法:
- 00 01 * * * /usr/scripts/mysqldump.sh
- 00 02 * * * /usr/scripts/application_backup.sh
- 10 01 * * * /usr/scripts/tar_db_appfile.sh
- 30 01 * * * /usr/scripts/cp_tar_remote_server.sh
- 10 02 * * * /usr/scripts/tardelete.sh
- 30 02 * * * /usr/scripts/clean_tmp.sh
多个任务在一个crontab中执行:
- 00 01 * * * /usr/scripts/mysqldump.sh && /usr/scripts/application_backup.sh && /usr/scripts/tar_db_appfile.sh && /usr/scripts/cp_tar_remote_server.sh && /usr/scripts/tardelete.sh && /usr/scripts/clean_tmp.sh
- -OR-
- 00 01 * * * /usr/scripts/mysqldump.sh; /usr/scripts/application_backup.sh; /usr/scripts/tar_db_appfile.sh; /usr/scripts/cp_tar_remote_server.sh; /usr/scripts/tardelete.sh; /usr/scripts/clean_tmp.sh
注意:双引号‘&&’和分号‘;’的区别是:‘&&’意味着作业将一个接一个地执行,而‘;’则表示无论前面的作业是否成功,第二或第三作业都将运行。
11. 如何在cron中使用特殊字符?
特殊字符是cron中用一个关键词替换其他字段来执行任务。我们可以在’@’后面接关键字,语法和含义如下。
- 关键字 等价于 含义
- @yearly 0 0 1 1 * --> 每年执行一次
- @monthly 0 0 1 * * --> 每月执行一次
- @daily 0 0 * * * --> 每天执行一次
- @hourly 0 * * * * --> 每小时执行一次
- @reboot -- --> 重启后执行一次
接下来我们用几个例子来说明关键字的使用方法。
12. 如何使用@yearly的特殊字符配置cronjob?
@yearly相当于‘0 0 1 1 *’。
- @yearly /usr/scripts/yearly_archival.sh
注意:上面的crontab任务将执行脚本,把所有前一年的数据移到存档服务器中。它将在每年的第一个月(一月)的00:00执行。
13. 如何使用@monthly特殊字符来配置cronjob?
@monthly相当于‘0 0 1 * *’。
- @monthly /usr/scripts/monthly-backup.sh
注意:上面的crontab任务将执行每月备份的脚本,它将在每月1日的00:00执行。
14. 如何使用@daily特殊字符串配置cronjob?
@daily相当于‘0 0 * * *’。
- @daily /usr/scripts/daily-temp.sh
注意:上述crontab任务将执行daily-temp.sh的脚本,它将清除temp文件夹中所有的临时文件。任务将在每天的00:00执行。
15. 如何使用@hourly特殊字符配置cronjob?
@hourly相当于‘0 * * *’。
- @hourly /usr/scripts/hourly_rsync_svnvmback.sh
注意:上述crontab任务将执行hourly_rsync_svnvmback.sh的脚本,它每小时将所有数据从线上服务器同步到备份服务器。
16. 如何使用@reboot特殊字符在每次重启后执行一个脚本/命令?
@reboot可以用来在每次重启服务器后执行一组命令/脚本。例如:在重启后,我们可以执行一个命令/脚本来检查服务的状态,如DNS、Apache状态等。
- @reboot /usr/scripts/bootup_service_status.sh
注意:上述crontab脚本将在每次重启后执行。这里,我在脚本中加入了检查“httpd, named,dhcpd”等状态的命令,这样它就会显示所有服务的状态列表。
我希望这篇文章能够帮助你学习Linux中的crontab命令。欢迎把你的反馈/意见告诉我。
感谢阅读!