共计 4191 个字符,预计需要花费 11 分钟才能阅读完成。
在 Linux 中,能够应用 crontab
命令指定周期执行的定时工作,也就是周期性在指定的工夫点执行某个工作,而不是执行一次之后就不再执行。
这个 crontab
命令用于设置在指定工夫点要进行的具体操作,通过特定格局的信息来进行指定,这些信息会被写入一个 crontab 文件。
这些定时工作由 cron 守护过程来执行,该过程始终运行在后盾,会定时查看 crontab 文件来判断须要做什么,如果某个工作须要被执行,就会执行该工作指定的操作。
一般来说,系统启动时,init 过程会启动 cron 过程。
能够应用 man crontab 来查看 crontab
命令的帮忙信息。
应用 man 5 crontab 来查看 ctontab 文件的格局,须要基于特定格局来设置定时工作。
应用 man 8 cron 命令查看 cron 守护过程的帮忙信息。
编辑定时工作
在 crontab
命令中,能够应用 -e
选项来指定编辑定时工作。
查看 man crontab 对 -e
选项的阐明如下:
The -e option is used to edit the current crontab using the editor specified by the VISUAL or EDITOR environment variables. After you exit from the editor, the modified crontab will be installed automatically. If neither of the environment variables is defined, then the default editor /usr/bin/editor is used.
即,crontab -e
命令编辑以后用户的 crontab 文件,在该文件中依照特定格局增加定时工作,优先应用 VISUAL、或者 EDITOR 环境变量值指定的编辑器来进行编辑。
如果这两个环境变量都没有定义,则默认应用 /usr/bin/editor 文件指定的编辑器。
在 Debian 零碎和 Ubuntu 零碎上,/usr/bin/editor 文件是一个链接文件,最终链接到 /bin/nano 文件,也就是默认应用 nano 编辑器。
在 Ubuntu 零碎上测试发现,第一次执行 crontab -e
命令时,它会调用 select-editor
命令提供一个编辑器菜单列表,能够抉择一个默认的编辑器。如果按 CTRL-D,什么都没有抉择,默认会应用 nano 编辑器。
crontab 文件格式
执行 crontab -e
命令后,就会关上以后用户的 crontab 文件,在这个文件中,以 #
结尾的语句是正文语句。
默认的 crontab 文件蕴含一些正文,在正文中提供了一个例子、以及设置定时工作的字段格局阐明。具体内容如下:
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# m h dom mon dow command
这里举例说明了一个 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
定时工作,在每周一的五点钟会执行 tar -zcf /var/backups/home.tgz /home/
命令。
上面具体阐明如何了解这个定时工作的各个字段。
在 crontab 文件中,通过 m h dom mon dow command
这六个字段来设置定时工作,每一行对应一个定时工作。这六个字段的含意阐明如下:
- m:对应分钟(minute)
指定要在一小时之中的第几分钟执行该工作。取值范畴是 0-59. - h:对应小时(hour)
指定要在一天之中的第几个小时执行该工作。取值范畴是 0-23. - dom:对应日期(day of month)
指定要在一月之中的第几天执行该工作。取值范畴是 0-31. - mon:对应月份(month)
指定要在一年之中的第几月执行该工作。取值范畴是 1-12。
也能够通过月份英文名称的前三个字母来指定,不辨别大小写。例 如,一月的英文单词是 january,那么这里能够用 jan 来指定一月。 - dow:对应星期几(day of week)
指定要在一周之中的星期几执行该工作。取值范畴是 0-7,0 和 7 都对应星期天。
也能够通过星期英文名称的前三个字母来指定,不辨别大小写。例如,星期一的英文单词是 monday,那么这里能够用 mon 来指定星期一。 - command:对应具体的操作
提供具体的命令来指定进行什么操作,能够提供脚本文件的门路来执行该脚本文件。这六个字段要求用空格隔开。且每个字段都必须提供值,不能省略某个字段的值。从第五个字段之后的所有内容都属于第六个字段,也就是要执行的操作。
前五个字段能够应用上面的特殊字符来指定一些非凡的工夫:
- *
示意任意一个无效的取值。例如,把日期指定为*
,则示意每一天都进行该工作。 - –
示意一个无效的范畴值。例如,在小时指定为8-11
,示意在 8 点、9 点、10 点、和 11 点都执行该工作。 - ,
示意隔开不同的取值列表。例如,把小时指定为2,3,5,7
,示意在 2 点、3 点、5 点、7 点都执行该工作。
留神:在逗号前面不要加空格,空格示意隔开不同的字段。 - /
示意一个工夫距离,而不是指定具体的工夫。例如,把小时指定为*/2
,示意每距离两小时执行一次该工作。
在 command 字段中,能够应用换行符、或者 % 字符来分隔命令内容。
在第一个 % 之前的内容会传递给 shell 来执行,这个 % 本身会被替换成换行符,在 % 之后、直到行末的内容都作为规范输出传递。
如果须要提供 % 字符本身,须要用 \%
进行本义。
cron 守护过程如何执行定时工作
在 man 5 crontab 的阐明中,有如下内容:
Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab’s owner. PATH is set to “/usr/bin:/bin”. HOME, SHELL, and PATH may be overridden by settings in the crontab;
An alternative for setting up the commands path is using the fact that many shells will treat the tilde(~) as substitution of $HOME, so if you use bash for your tasks you can use this:
SHELL=/bin/bash
PATH=~/bin:/usr/bin/:/bin
即,cron 守护过程默认应用 /bin/sh 这个 shell 来执行 crontab 文件指定的命令。
如果想要用 bash 来执行,能够 crontab 文件中增加 SHELL=/bin/bash
这一行。
默认的寻址门路是 “/usr/bin:/bin”,如果须要执行的命令、或者脚本文件没有放在这两个门路下,就须要通过文件门路来指定,倡议应用绝对路径。
因为定时工作是由 cron 守护过程来执行,须要确认该过程曾经启动,能力执行定时工作,能够应用上面命令来确认 cron 守护过程是否曾经启动:
$ service --status-all |& grep cron
[+] cron
$ ps -e | grep cron
2340 ? 00:00:36 cron
在 service --status-all |& grep cron
命令中,看到 cron 后面显示加号 +
,示意 cron 守护过程曾经启动。
在 ps -e | grep cron
命令中,要能查找到 cron 这个名称,阐明 cron 这个过程正在运行。
设置定时工作的实例
咱们在应用 crontab -e
命令关上 crontab 文件后,能够输出上面的一行:
*/5 * * * * date >> ~/testcron.txt
基于后面的阐明,第一个 */5
示意每距离 5 分钟就执行一次,前面四个 *
示意在每个月的每一天的每一个小时都执行该工作。
具体执行的命令是 date >> ~/testcron.txt
,把执行工作时的工夫追加写入到 testcron.txt 文件。
即,这个定时工作每天都会运行,每距离 5 分钟就运行一次。能够通过查看 testcron.txt 文件来确认是否执行过该工作。
保留文件之后,再过 5 分钟,查看 testcron.txt 文件内容如下:
$ ls
testcron.txt
$ cat testcron.txt
2019 年 12 月 03 日 星期二 14:20:01 CST
能够看到,在指定目录下生成了 testcron.txt 文件,且该文件内容就是 date
命令打印的日期,阐明执行过指定的定时工作。
隔了较长时间后,再查看 testcron.txt 文件内容如下:
$ cat testcron.txt
2019 年 12 月 03 日 星期二 14:20:01 CST
2019 年 12 月 03 日 星期二 14:25:01 CST
2019 年 12 月 03 日 星期二 14:30:01 CST
能够看到,的确是每隔 5 分钟就写入一次日期到 testcron.txt 文件。
查看定时工作内容
在 crontab
命令中,能够应用 -l
选项来查看 crontab 文件内容,从而看到外面蕴含的各个定时工作。
查看 man crontab 对 -l
选项的阐明如下:
The -l option causes the current crontab to be displayed on standard output.
这个文件会打印整个 crontab 文件内容,蕴含正文语句。局部内容列举如下:
# m h dom mon dow command
*/5 * * * * date >> ~/testcron.txt
其实间接执行 crontab -e
命令也能看到 crontab 文件内容,只是看完之后须要退出编辑器,没有 crontab -l
命令不便。
删除定时工作
如果要删除某个定时工作,执行 crontab -e
命令,从 crontab 文件删除对应定时工作所在的行,保留文件即可。也能够正文对应的行,以便后续须要的时候,再关上正文。
如果要删除所有定时工作,能够应用 -r
选项。查看 man crontab 对 -r
选项的阐明如下:
The -r option causes the current crontab to be removed.
即,-r
选项会删除以后用户的 crontab 文件,从而删除所有定时工作。