crontab命令

Posted by 婷 on June 26, 2022 本文总阅读量

概述

主要记录crontab命令的使用方法,包括什么是crontab命令,怎么使用,crontab命令的语法,以及简单的介绍其他相关的内容

什么是crontab

crontab 命令用于设置周期性被执行的指令。通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。

crontab语法

crontab的语法也不麻烦,其实大概就是下面这个格式

min hour day month week command

需要注意的是时间的取值范围,特别是week的取值,0或者7都是指周天

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) 
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

这里引用参考链接

image-20220626113448735

然后举两个简单的例子,自己动手对应下规则,就知道怎么写一条crontab命令。

例子一

该任务是每分钟我们会在/home/copyright 目录下创建一个以当前的年月日时分秒为名字的空白文件,比如/home/copyright/20220626114000/home/copyright/20220626114100等等

*/1 * * * * touch /home/copyright /$(date +\%Y\%m\%d\%H\%M\%S)

注意: “ % ” 在 crontab 文件中,有结束命令行、换行、重定向的作用,前面加 ” \ ” 符号转义,否则,“ % ” 符号将执行其结束命令行或者换行的作用,并且其后的内容会被做为标准输入发送给前面的命令。

当然如果你想把文件命名成2022-6-26这种还可以这样写

*/1 * * * * touch /home/copyright /$(date +%Y-%m-%d)

例子二

这个例子引用的是参考链接

假若你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 发一封信给他,这封信的内容已经写在 /home/dmtsai/lover.txt 内了,该如何进行?答案就是

59 23 1 5 * mail kiki < /home/dmtsai/lover.txt

其他事项

  • 对于最后一个command来说有两种形式

    • 命令型态 0 1 * * * * copyright mail -s "testing" kiki < /home/copyright /test.txt copyright 这个使用者的身份,在每小时运行一次 mail 命令。

    • 目录规划 */5 * * * * root run-parts /root/runcron每隔五分钟,运行/root/runcron目录下的命令。这里的run-parts相当于说切换到后面的目录然后把目录下的内容打印出来,也是linux的一个程序

      image-20220626163135173

  • 周与日月不可同时并存

    另一个需要注意的地方在于,你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作。像下面就是错误的写法。

    30 12 11 9 5 root echo "just test"
    

crontab使用命令

好了知道crontab的命令怎么写了,那现在就说说怎么让crontab命令执行起来。

开启crontab服务

crontab 命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。通常,crontab 储存的指令被守护进程激活,crond 为其守护进程,crond 常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行。也就是说,就算你添加了任务,但是如果 cron 的守护进程并没有启动,它根本都不会监测到有任务,啥也不会干。

开启服务(但是一般都是开启的)

sudo /etc/init.d/cron start

我们可以通过下列命令查找是否cron服务在后台启动

 ps aux | grep cron
 #or
 pgrep cron

image-20220626172219547

添加crontab任务

添加计划任务的命令为(e其实就是edit的意思啦)

crontab -e 表示为当前用户添加计划任务
sudo crontab -e 表示为root用户添加计划任务

个人理解,其实也可以在普通用户模式下用sudo执行一些root命令

image-20220626161559562

会先选择编辑器,我这里选择[3],输入后就是下面这个界面了

image-20220626164953790

这里我们添加一个任务

*/1 * * * * echo test!!!!

image-20220626165146682

保存后可以看到

image-20220626165211528

我们通过这样一个命令可以查看到执行任务命令之后在日志中的信息反馈:

sudo tail -f /var/log/syslog

image-20220626165352241

查看crontab任务

当然我们也可以通过这样的一个指令来查看我们添加了哪些任务:

crontab -l

image-20220626165450442

删除crontab任务

如果我们只是想移除一项工作的话,就还是老老实实用crontab -e 去编辑,如果是想要清楚所有的任务,则用

crontab -r

image-20220626165903241

关闭crontab服务

sudo /etc/init.d/cron stop

image-20220626172320854

当然上面的命令是在我的Ubuntu下,在我的板子上应该是sudo /etc/init.d/crond stop

image-20220626172530843

注意

有的时候,我们以系统的 cron 来进行例行性工作的创建时,要注意一些使用方面的特性。 举例来说,如果我们有四个工作都是五分钟要进行一次的, 如果同时进行,该四个动作又很耗系统资源,如此一来,每五分钟不是会让系统就会“忙”一次。如果每个流程都在同一个时间启动的话,那么在某个时段时,系统会变的相当的繁忙, 所以,这个时候就必须要分别配置啦,可以这样做:

[root@www ~]# vi /etc/crontab 
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root  CMD1 
2,7,12,17,22,27,32,37,42,47,52,57 * * * * root  CMD2 
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root  CMD3 
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root  CMD4 

『 , 』分隔的时候,请注意,不要有空白字节。如此一来, 则可以将每五分钟工作的流程分别在不同的时刻来工作,让系统的运行较为顺畅。

/etc/crontab

我们的cron守护进程,会每分钟去读取/etc/crontab这个文件的内容,所以有些系统级别的服务会放在/etc/crontab这个文件中,我们可以查看这个文档里面是什么内容

image-20220626174635579

根据前面的语法,不难推断

  • /etc/cron.daily,目录下的脚本会每天执行一次,在每天的 6 点 25 分时运行
  • /etc/cron.hourly,目录下的脚本会每个小时执行一次,在每小时的 17 分钟时运行
  • /etc/cron.monthly,目录下的脚本会每月执行一次,在每月 1 号的 6 点 52 分时运行
  • /etc/cron.weekly,目录下的脚本会每周执行一次,在每周第七天的 6 点 47 分时运行

相关内容

  • 其他与crontab命令相关的at,还有anacron,以后有时间可以适当了解
  • crontab -e的内容没有写入/etc/crontab的原理其实并没有提到,其实就是cron 这个服务会每分钟去读取一次 /etc/crontab/var/spool/cron 里面的数据内容,而我们普通用户的任务就存放在/var/spool/cron里面

参考链接