在Linux中的Crontab – 实时示例和工具
让我们来探索crontab以及与crontab相关的命令和各种操作。
我们将学习如何使用cron实用程序安排任务,并最后讨论一些在线工具,这些工具可以帮助我们格式化和测试cron命令。
起源
Crontab代表“cron表”。cron一词来源于希腊词Chronos,意为时间。Crontab是一个系统守护进程,它会根据预定的时间自动执行一些任务和作业。
用例
Crontab可用于执行各种操作,例如处理自动备份、轮转日志文件、在远程机器之间同步文件和清理临时文件夹等。Crontab可用于任何类型的工作,但当我们开始处理system administration类型的工作时,它尤为有用。
使用cron,administrator可以安排在特定时间和日期运行作业。
那么让我们看看如何设置这个。
Crontab语法
要执行一系列命令,cron实用程序读取配置文件。为了解释crontab配置表中的行,它遵循Crontab语法。Crontab有六个字段,前五个(1-5)字段定义执行的日期和时间。最后一个字段,即第6个字段,可以是用户名和/或要执行的任务/作业/命令/脚本。
* * * * * USER_NAME COMMAND/SCRIPT-TO-EXECUTE
│ │ │ │ │
│ │ │ │ │
│ │ │ │ |_________ 星期几 (0 – 6) (0代表星期天,或使用名称)
│ │ │ |____________ 月份 (1 – 12),*表示每月
│ │ |______________ 日期 (1 – 31),*表示每天
│ |________________ 小时 (0 – 23),*表示每小时
|___________________ 分钟 (0 – 59),*表示每分钟
注意:
- 星号(*)用于匹配字段的所有可能值。例如,小时字段中使用星号等同于每小时,而月份字段中的星号等同于每个月。
- 用户名是可选的(仅在系统crontab文件中可用)
示例:
通过一些示例来了解上述语法
1. 安排cron在每天早上5点执行
0 5 * * * /scripts/job.sh
2. 安排cron每天早上6点和下午6点各执行一次
0 6,18 * * * /scripts/job.sh
3. 安排cron每分钟执行一次
* * * * * /scripts/job.sh
4. 安排cron每周一晚上7点执行
0 19 * * mon /scripts/job.sh
5. 安排cron每15分钟执行一次
*/10 * * * * /scripts/job.sh
6. 安排cron仅在选定的月份执行
* * * feb,jun,oct * /script/job.sh
7. 在3月4日上午7:25运行shell脚本/home/script/backup.sh
25 7 4 3 * /home/script/backup.sh
8. 安排cron每30秒执行一次
由于Crontab中没有秒控制权,但我们可以通过以下两步实现。
- 首先安排每分钟运行一次的任务。
* * * * * /home/scripts/script.sh
- 现在让我们使用
sleep
命令暂停30秒的执行。
* * * * * sleep 30; /home/scripts/script.sh
上述任务将停止30秒钟的执行,然后再次恢复。
Cron配置文件的类型
有两种类型的Cron配置文件:
UNIX/Linux系统Crontab
这需要root权限,因为通常用于系统服务和关键任务。上面语法描述中的第六个字段是要运行的命令的用户名称。它使系统crontab能够像任何用户一样运行命令。
用户Crontab
用户还可以使用crontab命令安装自己的cron作业。在上述语法描述中,第六个字段是要运行的命令,所有命令都是以创建crontab的用户身份运行的。
每个用户都可以拥有自己的crontab文件,尽管这些文件位于/var/spool/cron/
crontabs目录中,但它们不应直接进行编辑。我们需要使用crontab命令来编辑或设置自己的cron作业。
它是如何工作的?
cron服务(守护进程)在后台运行并不断检查(每分钟)/etc/crontab
文件和/etc/cron.*/
目录。它还检查/var/spool/cron/
目录。
当分钟、小时和月份字段与当前时间匹配,并且两个日期字段(月份中的日期或星期中的日期)中至少有一个与当前日期匹配时,命令将由cron执行。
基本命令
列出现有的Cron作业
我们可以使用以下命令列出所有的Cron作业,而无需打开crontab配置文件。
crontab -l
如果没有现有的作业,它将返回以下输出。
[姚伟斌@localhost ~]# crontab -l
没有姚伟斌的crontab
[姚伟斌@localhost ~]#
如果用户已经添加了一些作业,它将显示如下。
[姚伟斌@localhost ~]# crontab -l
#编辑此文件以引入由cron运行的任务。
#每个要运行的任务必须通过一行定义
#指示任务何时运行的不同字段
#以及要运行的任务的命令
#
#要定义时间,可以为具体的值提供
#分钟(m)、小时(h)、月(dom)、月(mon),
#和星期几(dow)或在这些字段中使用“*”(表示“任意”)。
#请注意,任务将根据cron系统守护进程的时间和时区开始。
#
#将crontab作业的输出(包括错误)发送到
#电子邮件发送给crontab文件所属的用户(除非重定向)。
#
#例如,您可以在每周的凌晨5点对所有用户帐户进行备份
#0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
#有关更多信息,请参阅crontab(5)和cron(8)的手册页。
#
#m h dom mon dow command
0 */1 * * * /home/account/scripts/updateAccountStatuses.sh
0 */1 * * * /home/account/scripts/reActivateAccountStatus.sh
[姚伟斌@localhost ~]#
Cron表是用户特定的,这意味着您必须使用特定的用户登录才能查看cron表列表。
列出特定用户的Cron
要列出另一个用户的计划作业,请使用选项-u(用户)和-l(列表)。
crontab -u 另一个用户名 -l
示例:crontab -u 姚伟斌 -l
添加/修改Crontab条目
要编辑crontab条目,我们可以使用-e
选项,如下所示。
crontab -e
上述命令将打开vi编辑器,您可以在其中指定作业的详细信息并保存文件。保存后,可以使用crontab -l
验证是否配置了cron。
为特定用户添加/修改Crontab条目
我们可以使用以下命令为另一个用户编辑crontab
crontab -u 另一个用户名 -e
示例:crontab -u 姚伟斌 -e
删除Crontab条目
使用-r
参数与Crontab一起使用,可以从crontab中删除完整的计划任务而无需确认。
crontab -r
如果您想在删除计划任务之前进行确认,请使用-i
选项与-r
一起使用,这将在删除用户的crontab之前提示用户确认。
crontab -i -r
[姚伟斌@localhost ~]# crontab -i -r
crontab: really delete 姚伟斌's crontab?
Crontab特殊字符串
除了我们讨论过的上述语法外,Crontab还提供了八个特殊字符串。这不仅可以节省时间,还可以提高可读性。
特殊字符串 | 描述 |
@reboot |
启动后运行一次。 |
@yearly |
每年运行一次,即0 0 1 1 * |
@annually |
与@yearly 相同 |
@monthly |
每月运行一次,即0 0 1 * * |
@weekly |
每周运行一次,即0 0 * * 0 |
@daily |
每天运行一次,即0 0 * * * |
@midnight |
与@daily 相同 |
@hourly |
每小时运行一次,即0 * * * * |
Crontab特殊字符串示例
1. 按年计划任务的Crontab
@yearly /scripts/greeting.sh
我们可以使用上述命令发送新年祝福,它会在每年的第一分钟执行。
2. 按月计划任务的Crontab
@monthly /scripts/cleanup.sh
我们可以使用上述命令在每个月初执行一些清理活动。
类似地,我们可以使用其他Crontab特殊字符串来实现每周、每日和每小时的目的。
Cron目录
系统管理员可以使用系统范围的cron计划,这些计划位于预定义的cron目录下,如下所示
- /etc/cron.d
- /etc/cron.daily
- /etc/cron.hourly
- /etc/cron.monthly
- /etc/cron.weekly
Crontab实时示例
让我们讨论一些实时示例,这些示例通常由系统管理员或IT专业人员使用。
删除空文件和目录
45 0 * * * 姚伟斌 find /tmp -type f -empty -delete
上述cron表达式将从/tmp目录中查找空文件和目录,并删除它们。此任务将在每天的12.45 AM运行。我们需要提及用户名来执行此任务。在上面的示例中,姚伟斌用户执行cron作业。
使用单个cron执行多个任务
* * * * * /home/scripts/backup.sh; /home/scripts/scritp.sh
可以使用分号(;)分隔多个任务/作业,并将其分配给单个cron表达式。
Cron格式化和测试工具
到目前为止,我们已经讨论了使用crontab安排任务的命令和语法。但是,如果您不是系统管理员,您的工作不是经常设置Cron,可能无法记住语法,并且这会导致出错的可能性。不要担心,我们有解决这个问题的方法。
有几个在线可用的Cron格式化工具。
# 1. Cron Job Generator
Cron Job Generator是一个非常用户友好的GUI,您可以在其中指定脚本的分钟数、天数和路径以生成crontab。
让我们以一个实时例子来说明,在星期一到星期五的每5分钟执行/home/processMonitor.sh
。
因此,我得到了下面的Cron语法,可以通过执行以下命令将其放入我的crontab中:
crontab –e
0,5,10,15,20,25,30,35,40,45,50,55 * * * 1-5 /home/processMonitor.sh
# 2. Crontab生成器
Crontab Generator是另一个方便的工具,可用于生成crontab。使用此工具,您还可以选择是否将cron输出保存到文件或发送到电子邮件。
# 3. Crontab Guru
Crontab Guru是一个简单的在线cron计划表达式编辑器。此外,它还提供了一种有用的监视cron作业的方法。我们只需复制提供的命令并附加到crontab定义的末尾。如果cron作业失败或甚至不启动,您将收到警报电子邮件。
在下面的例子中,作业将在每天、每个月和每个星期的04:05执行。
# 4. CRON测试工具
CRON Tester允许我们测试cron时间/日期定义。可能有这样的情况,我们必须解码现有的cron语法以进行故障排除或进行测试。
为此,我们可以使用这个工具。我们只需将我们的cron表达式复制并粘贴到cron定义字段中,然后选择迭代次数,点击Test来查看它将在哪些日期运行。
让我们检查我们的一个cron表达式4 3 */2 * *
,它应该在每两天的03:04(AM)运行。让我们使用cron测试工具来验证它。
结论
我希望以上内容能帮助您更好地理解Crontab和设置cron作业。通过Cron调度作业是Linux管理员执行的众多任务之一。如果您有兴趣学习高级技能,请查看此course。