概述
主要记录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
这里引用参考链接
然后举两个简单的例子,自己动手对应下规则,就知道怎么写一条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
的一个程序
-
-
周与日月不可同时并存
另一个需要注意的地方在于,你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作。像下面就是错误的写法。
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
添加crontab任务
添加计划任务的命令为(e
其实就是edit
的意思啦)
crontab -e 表示为当前用户添加计划任务
sudo crontab -e 表示为root用户添加计划任务
个人理解,其实也可以在普通用户模式下用sudo
执行一些root
命令
会先选择编辑器,我这里选择[3],输入后就是下面这个界面了
这里我们添加一个任务
*/1 * * * * echo test!!!!
保存后可以看到
我们通过这样一个命令可以查看到执行任务命令之后在日志中的信息反馈:
sudo tail -f /var/log/syslog
查看crontab任务
当然我们也可以通过这样的一个指令来查看我们添加了哪些任务:
crontab -l
删除crontab任务
如果我们只是想移除一项工作的话,就还是老老实实用crontab -e
去编辑,如果是想要清楚所有的任务,则用
crontab -r
关闭crontab服务
sudo /etc/init.d/cron stop
当然上面的命令是在我的Ubuntu
下,在我的板子上应该是sudo /etc/init.d/crond stop
注意
有的时候,我们以系统的 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
这个文件中,我们可以查看这个文档里面是什么内容
根据前面的语法,不难推断
/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
里面