在Linux/Unix中,我们可以使用cron命令来自动运行和调度任务,您可以一次性或定期执行任务。“cron”广泛用于定期执行重复性任务(使用名为“crontab”的命令运行),而“at”程序用于在特定时间段内执行一次任务。Crontab为所有用户维护单独的crontab文件。这些自动化任务对许多使用Linux服务器的管理员来说非常有用。通常,“crontab”文件用于备份、更新系统、同步服务器等任务。cron的一大优点是您无需详细了解它,只需了解如何使用它即可设置cron作业的一部分。本教程将指导您完成crontab的各种选项。以下所有crontab示例都已在RHEL/CENTOS7.6上进行测试。首先我们看一下crontab的基本语法和表达方式:MinutehourDay-of-MonthMonth-of-YearDay-of-WeekCommand0-590-231-311-120-6command/scriptCrontab一共有6个字段。字段1-5是日期和时间,字段6可用于任何可执行的Linux命令或脚本。注意:时间字段采用24小时格式。1、如何在每天的特定时间执行cronjob?要将作业添加到crontab,我们应该使用“-e”选项。添加任务后,vi编辑器将打开crontab配置文件,然后使用“:wq!”保存并关闭文件。#crontab-e3001***/usr/scripts/rsync_svnvmback.sh>/dev/null2>&1注意:在这里,我们有一个名为“rsync_svnbackup.sh”的bash脚本,它每天(周一至周日)凌晨1点运行30:00执行。任务执行后,Cron将向指定用户发送有关任务状态(成功或失败)的通知电子邮件。如果不需要通知,那么我们可以在脚本末尾使用>/dev/null2>&1命令禁用它,这将禁用所有通知。2.如何列出crontab任务?使用以下命令列出我们添加到crontab配置文件中的任务。在这里,我们使用的是root帐户。#crontab-l3001***/usr/scripts/rsync_svnvmback.sh>/dev/null2>&1注意:'-l'是一个选项,用于列出当前登录用户的crontab列表。3.如何以其他用户身份修改cronjob?例如,我想将crontab作业修改为另一个名为“linuxteck”的用户。#crontab-ulinuxteck-e3001***/usr/scripts/rsync_svnvmback.sh注意:以上命令只能由高权限用户执行,例如“root用户或超级用户”,或者被授予权限的普通用户.这里的“-u”代表用户名,“-e”选项代表编辑。4.如何列出其他用户的crontab任务?以下命令将显示其他用户(linuxteck)的任务列表。#crontab-ulinuxteck-l3001***/usr/scripts/rsync_svnvmback.sh注意:记住,只有root/超级用户才能执行以上命令,或者是具有相同权限的普通用户。5.如何配置一个cronjob每分钟运行一次?这种要求在实践中很少使用,但有一些用例。示例:如果您使用rsync脚本/命令从实时服务器同步备份,则备份服务器将每分钟从实时服务器获取更新。#crontab-e*****/usr/scripts/rsync_svnvmback.sh注意:上面的crontab任务(rsync_svnvmback.sh)将在全年的每时每刻运行。6.如何配置一个cronjob每天运行两次?这意味着一个命令/脚本将在一天内执行两次。举个例子:一些公司在早上和晚上做数据库备份,比方说早上6点和晚上8点。0006,20***/usr/scripts/mysqldump.sh>/dev/null2>&1注意:小时字段使用逗号分隔值。该脚本将在每天早上6点和晚上8点执行。如第一个示例中所述,使用“>/dev/null2>&1”命令禁用通知。7.如何配置一个cronjob每10分钟运行一次?以下任务可以连续每10分钟执行一次命令/脚本。*/10****/usr/scripts/rsync_svnvmback.sh注意:您可以根据自己的测试需求调整为5分钟或10分钟。8.如何配置cronjob在特定的一天执行?使用以下配置,我们可以在特定的一天执行cronjob。示例:您只能在周五和周日晚上11点运行备份脚本。>023**fri,sun/usr/scripts/rsync_svnvmback.sh注意:这里我使用了日期的缩写,并且用逗号分隔而不是数字,方便用户理解。如果您使用数字,在某些系统上为0-6,在某些系统上为1-7。所以很多初学者在配置“星期天”的时候很迷茫,是用0还是7,其实'0和7'都代表星期天。9.如何配置定时任务在特定月份运行?使用下面的配置,我们可以为特定月份执行一个cronjob,例如:脚本应该只在1月和7月的晚上11点执行。023*jan,jul*/usr/scripts/rsync_svnvmback.sh注意:crontab语法中的第四个字段是月份的名称。如果超过一个月执行,用逗号隔开。10.如何在一行中连续运行多个cronjobs?通常情况下,我们针对不同的任务,在不同的时间,一个一个的添加crontab任务。实际上,我们可以在特定的时间添加多个任务,一个接一个地执行。例如:我有多个命令/脚本要在我的服务器上执行,即备份数据库,备份应用程序文件,然后压缩数据库和文件,并将那些tar文件推送到备份位置,然后从中删除那些tar文件server/archive文件,然后清理tmp文件等。在这种情况下,如果我们同时执行所有脚本,将会极大地影响服务器的性能。例如,它可能会导致服务器磁盘空间不足,内存、CPU和带宽的使用率会显着增加,有时甚至会导致服务器无响应。这种情况下,我们可以在crontab中使用如下方法让脚本一个一个执行,例如:如果我们有5组脚本要在凌晨1点运行,那么第一个脚本会在凌晨1点开始运行,执行一次完成后,第二个立即开始,依此类推。常规做法:0001***/usr/scripts/mysqldump.sh0002***/usr/scripts/application_backup.sh1001***/usr/scripts/tar_db_appfile.sh3001***/usr/scripts/cp_tar_remote_server.sh1002***/usr/scripts/tardelete.sh3002***/usr/scripts/clean_tmp.sh多个任务在一个crontab中执行:0001***/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-0001***/usr/scripts/mysqldump.sh;/usr/脚本/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注意:双引号'&&'和分号符号';'之间的区别is:'&&'表示作业将一个接一个地执行,而';'意味着无论前一个作业是否成功,第二个或第三个作业都会运行。11.如何在cron中使用特殊字符?特殊字符用于在cron中用关键字替换其他字段以执行任务。我们可以在'@'后面加上关键字,语法和含义如下。关键字等同于@yearly0011*-->每年执行一次@monthly001**-->每月执行一次@daily00***-->每天执行一次@hourly0***-->执行onceanhour@reboot---->Executeonceafterreboot接下来我们通过几个例子来说明关键字的使用。12.如何配置@yearly特殊字符的cronjob?@yearly相当于'0011*'。@yearly/usr/scripts/yearly_archival.sh注意:上述crontab任务将执行脚本以将所有前一年的数据移动到存档服务器。每年第一个月(一月)00:00执行。13.如何使用@monthly特殊字符配置cronjob?@monthly相当于'001**'。@monthly/usr/scripts/monthly-backup.sh注意:上面的crontab任务会执行每月备份的脚本,每月1号00:00执行。14.如何配置@daily特殊字符串的cronjob?@daily相当于'00***'。@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命令。请随时让我知道您的反馈/意见。谢谢阅读!
