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
来跳转到下一个或者上一个匹配的内容。
评论区