Linux crontab命令介绍
crontab命令是Linux系统中用来定期执行任务的一个工具。它可以让用户在指定的时间或者间隔执行一些命令或者脚本。crontab命令的名字来自于cron table的缩写,表示一个时间表的意思。crontab命令有以下几个特点:
- crontab命令可以让用户编辑自己的定时任务,也可以让管理员编辑其他用户的定时任务,只要有相应的权限。
- crontab命令的执行依赖于crond服务,这是一个后台进程,每分钟会检查一次是否有需要执行的任务,如果有,就会自动执行。
- crontab命令的执行结果会通过邮件发送给用户,除非用户指定了输出重定向。
- crontab命令的语法和格式有一些特殊的规则,需要注意遵守。
Linux crontab命令适用的Linux版本
crontab命令是一个通用的Linux命令,几乎所有的Linux发行版都支持它,包括Ubuntu, Debian, CentOS, Fedora, Red Hat, SUSE等。不过,不同的发行版可能有一些细微的差别,比如crontab文件的位置,crond服务的管理方式,crontab命令的选项等。下面是一些常见的发行版的crontab命令的特点:
- Ubuntu和Debian:crontab文件的位置在
/var/spool/cron/crontabs,每个用户有一个单独的文件,文件名就是用户名。crond服务的管理方式是使用service cron start|stop|restart|status命令。crontab命令的选项有-u(指定用户),-e(编辑),-l(列出),-r(删除),-i(删除前询问)等。 - CentOS和Fedora:crontab文件的位置在
/var/spool/cron,每个用户有一个单独的文件,文件名就是用户名。crond服务的管理方式是使用systemctl start|stop|restart|status crond命令。crontab命令的选项有-u(指定用户),-e(编辑),-l(列出),-r(删除),-i(删除前询问),-n(显示下一次执行的时间)等。 - Red Hat和SUSE:crontab文件的位置在
/var/spool/cron,每个用户有一个单独的文件,文件名就是用户名。crond服务的管理方式是使用/etc/init.d/crond start|stop|restart|status命令。crontab命令的选项有-u(指定用户),-e(编辑),-l(列出),-r(删除),-i(删除前询问),-s(选择编辑器)等。
如果要在不同的Linux发行版之间切换,可以使用tab键来显示crontab命令的选项,或者使用man crontab来查看详细的帮助信息。
Linux crontab命令的基本语法
crontab命令的基本语法是:
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e | -i | ... }
其中,-u user是指定用户,如果不使用这个选项,就表示当前用户。file是一个包含定时任务的文件,每一行表示一个任务。-l是列出当前用户的定时任务,-r是删除当前用户的定时任务,-e是编辑当前用户的定时任务,-i是在删除前询问,其他的选项根据不同的发行版有所不同,可以使用tab键或者man crontab来查看。
如果使用crontab file的方式来创建或者更新定时任务,那么file中的每一行的格式是:
minute hour day month weekday command
其中,minute表示分钟,取值范围是0-59;hour表示小时,取值范围是0-23;day表示一个月中的第几天,取值范围是1-31;month表示月份,取值范围是1-12;weekday表示一个星期中的第几天,取值范围是0-6,0表示星期天;command表示要执行的命令或者脚本,可以是绝对路径或者相对路径,如果是相对路径,需要指定环境变量PATH。
每个字段可以使用以下的符号来表示不同的含义:
*表示任意值,比如* * * * *表示每分钟都执行。-表示范围,比如1-5 * * * *表示每小时的第1到第5分钟执行。,表示列举,比如1,3,5 * * * *表示每小时的第1,第3,第5分钟执行。/表示间隔,比如*/10 * * * *表示每隔10分钟执行一次。L表示最后,只能用在day和weekday字段,比如* * L * *表示每月的最后一天执行,* * * * 5L表示每月的最后一个星期五执行。W表示最近的工作日,只能用在day字段,比如* * 15W * *表示每月的最近的工作日执行,如果15号是周六,就在14号执行,如果15号是周日,就在16号执行。?表示不指定值,只能用在day和weekday字段,比如* * ? * 1表示每月的每个星期一执行。@表示特殊的含义,有以下几种:@reboot表示每次启动时执行。@yearly或者@annually表示每年的1月1日的0点执行,相当于0 0 1 1 *。@monthly表示每月的第一天的0点执行,相当于0 0 1 * *。@weekly表示每周的第一天的0点执行,相当于0 0 * * 0。@daily或者@midnight表示每天的0点执行,相当于0 0 * * *。@hourly表示每小时的第一分钟执行,相当于0 * * * *。
Linux crontab命令的常用选项说明
crontab命令的常用选项有以下几个:
-u user:指定用户,如果不使用这个选项,就表示当前用户。这个选项需要有相应的权限,一般只有管理员才能使用。-e:编辑当前用户的定时任务,会打开一个文本编辑器,让用户输入或者修改定时任务的内容。默认的文本编辑器是vi,如果想要使用其他的编辑器,可以设置VISUAL或者EDITOR环境变量,比如export VISUAL=nano或者export EDITOR=emacs。-l:列出当前用户的定时任务,会显示一个类似于file的内容,每一行表示一个任务。-r:删除当前用户的定时任务,会清空当前用户的定时任务的内容,相当于输入一个空的file。-i:在删除前询问,会在执行-r选项之前,提示用户是否确定删除,需要输入y或者n来回答。-n:显示下一次执行的时间,会在执行-l选项之后,显示每个任务的下一次执行的时间,格式是yyyy-mm-dd hh:mm
Linux crontab命令的实例
下面是一些crontab命令的实例,结合了最常搜索的关键词,如何设置定时任务,如何执行脚本,如何重定向输出等。
- 每隔5分钟执行一次
date命令,并将结果追加到/tmp/date.log文件中:
[linux@bashcommandnotfound.cn ~]$ crontab -e
*/5 * * * * date >> /tmp/date.log
- 每天的8点,12点,16点,20点执行一次
/home/user/backup.sh脚本,该脚本用来备份一些文件,并将输出重定向到/dev/null,表示忽略输出:
[linux@bashcommandnotfound.cn ~]$ crontab -e
0 8,12,16,20 * * * /home/user/backup.sh > /dev/null 2>&1
- 每周一的9点执行一次
/usr/bin/apt update命令,该命令用来更新软件包的列表,并将输出和错误发送到user@domain.com邮箱:
[linux@bashcommandnotfound.cn ~]$ crontab -e
0 9 * * 1 /usr/bin/apt update 2>&1 | mail -s "apt update" user@domain.com
- 每月的最后一天的23点59分执行一次
/home/user/clean.sh脚本,该脚本用来清理一些临时文件:
[linux@bashcommandnotfound.cn ~]$ crontab -e
59 23 L * * /home/user/clean.sh
- 每次启动时执行一次
/home/user/init.sh脚本,该脚本用来初始化一些环境变量和服务:
[linux@bashcommandnotfound.cn ~]$ crontab -e
@reboot /home/user/init.sh
Linux crontab命令的注意事项
使用crontab命令时,需要注意以下几点:
- crontab命令的执行依赖于crond服务,如果crond服务没有启动,那么定时任务就不会执行,所以需要确保crond服务的状态是正常的,可以使用以下命令来检查和管理crond服务:
[linux@bashcommandnotfound.cn ~]$ service cron status # Ubuntu和Debian
[linux@bashcommandnotfound.cn ~]$ systemctl status crond # CentOS和Fedora
[linux@bashcommandnotfound.cn ~]$ /etc/init.d/crond status # Red Hat和SUSE
- crontab命令的执行结果会通过邮件发送给用户,如果用户没有配置邮件服务,那么就会收不到邮件,所以需要安装和配置邮件服务,比如
sendmail或者postfix,可以使用以下命令来安装和配置邮件服务:
[linux@bashcommandnotfound.cn ~]$ sudo apt install sendmail # Ubuntu和Debian
[linux@bashcommandnotfound.cn ~]$ sudo yum install postfix # CentOS和Fedora
[linux@bashcommandnotfound.cn ~]$ sudo zypper install postfix # Red Hat和SUSE
-
crontab命令的执行环境和用户的登录环境是不同的,所以需要注意以下几点:
- 如果要执行的命令或者脚本不在环境变量
PATH中,那么需要使用绝对路径,或者在crontab文件中指定PATH变量,比如PATH=/usr/local/bin:/usr/bin:/bin。 - 如果要执行的命令或者脚本需要一些其他的环境变量,那么也需要在crontab文件中指定,比如
HOME=/home/user,LANG=zh_CN.UTF-8等。 - 如果要执行的脚本是用
bash,python,perl等编写的,那么需要在脚本的第一行指定解释器的路径,比如#!/bin/bash,#!/usr/bin/python,#!/usr/bin/perl等。 - 如果要执行的命令或者脚本需要用户的输入,那么需要使用
-y,-n,--force等选项来避免交互,或者使用yes命令来模拟输入,比如yes | apt upgrade。
- 如果要执行的命令或者脚本不在环境变量
-
如果在执行crontab命令时,出现了
bash: crontab: command not found的错误,表示没有安装crontab命令,需要使用以下命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo apt install cron # Ubuntu和Debian
[linux@bashcommandnotfound.cn ~]$ sudo yum install cronie # CentOS和Fedora
[linux@bashcommandnotfound.cn ~]$ sudo zypper install cron # Red Hat和SUSE
Linux crontab命令的快捷键
在使用crontab -e命令编辑定时任务时,可以使用一些快捷键来方便操作,这些快捷键和vi编辑器的快捷键是一样的,下面是一些常用的快捷键:
i:进入插入模式,可以输入或者修改内容。Esc:退出插入模式,回到命令模式。:w:保存修改,不退出编辑器。:q:退出编辑器,不保存修改。:wq:保存修改,并退出编辑器。:q!:强制退出编辑器,不保存修改。u:撤销上一次的修改。Ctrl+r:重做上一次的修改。h:向左移动光标。j:向下移动光标。k:向上移动光标。l:向右移动光标。0:移动光标到行首。$:移动光标到行尾。G:移动光标到文件末尾。gg:移动光标到文件开头。x:删除光标所在的字符。dd:删除光标所在的行。yy:复制光标所在的行。p:粘贴复制的内容到光标后面。/:搜索内容,输入要搜索的内容,按回车,然后使用n和N来跳转到下一个或者上一个匹配的内容。
评论区