侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux crontab命令详解:如何设置定时任务、执行脚本、重定向输出(附实例教程和注意事项)

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表示最后,只能用在dayweekday字段,比如* * L * *表示每月的最后一天执行,* * * * 5L表示每月的最后一个星期五执行。
  • W表示最近的工作日,只能用在day字段,比如* * 15W * *表示每月的最近的工作日执行,如果15号是周六,就在14号执行,如果15号是周日,就在16号执行。
  • ?表示不指定值,只能用在dayweekday字段,比如* * ? * 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/userLANG=zh_CN.UTF-8等。
    • 如果要执行的脚本是用bashpythonperl等编写的,那么需要在脚本的第一行指定解释器的路径,比如#!/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:粘贴复制的内容到光标后面。
  • /:搜索内容,输入要搜索的内容,按回车,然后使用nN来跳转到下一个或者上一个匹配的内容。
0

评论区