提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
cron这个东西相信使用linux系统的人都不陌生,可以说是最常用的一个命令了。虽然我已经用的滚瓜烂熟了,还是想写一个博客来给那些不太会用的小伙伴们细致讲解下。
注:本篇以Ubuntu-20.04系统展开,其它发行版基本差不多
一、cron是什么?
坦白来讲它就是linux的一个shell命令,具体功能就是负责处理定时任务。基本上系统安装好之后,默认会自带一些定时任务,也可以手动添加定时任务。如果命令需要使用环境变量,必须在crontab中定义。
下面是没有任何用户配置的/etc/crontab文件
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
注:定义了执行脚本的环境/bin/shell还有部分命令的环境变量,如果你要用到的命令在这些目录里面就可以不用全路径,保险起见为了统一习惯可以都写全路径
二、使用步骤
1.字段含义
先找一个样本分析下,下面的是我安装的nvidia的sdkmanager程序,这个程序的功能是给jetson设备刷机用的,默认你安装的时候会自动往用户配置里加一条cron配置,具体含义请往下看。
0 12 */7 * * /bin/bash /home/anold/.nvsdkm/.updater/updater.sh
cron表中的每一行(表项)均由6个字段组成,字段之间以空格分隔并按照以下顺序排列,从左至右依次是: ? 分钟(0~59); ? 小时(0~23); ? 天(1~31); ? 月份(1~12); ? 星期中的某天(0~6); ? 命令(在指定时间执行的脚本或命令)。
前5个字段指定了命令开始执行的时间。多个值之间用逗号分隔(不要用空格)。星号表示任 何时间段。除号表示调度的时间间隔(在天数字段上出现的*/7表示每隔7天执行一次)。
特别说明1:所有的命令最好都写全路径,防止因为环境变量配置导致command not found的问题。反正你只要记得一点,写全路径肯定没错!
所以上面的脚本解释起来就很容易了,每隔7天的当天中午12点整(24小时制)执行一下更新检查脚本,具体脚本内容就不贴出来了,感兴趣的小伙伴可以自己安装程序查看。
特别说明2:星期那一项0是周末不是周一,星期这个习惯是从西方传过来的,西方的习惯里星期天是一周的第一天。
2.加强学习
(1) 在每天中每小时的第2分钟执行脚本test.sh:
02 * * * * /home/slynux/test.sh
(2) 在每天的第5、6、7小时执行脚本test.sh:
00 5,6,7 * * * /home/slynux/test.sh
(3) 在周日的时候,每隔2个小时执行脚本script.sh:
00 */2 * * 0 /home/slynux/script.sh
(4) 在每天凌晨2点关闭计算机:
00 02 * * * /sbin/shutdown -h
当你编辑完/etc/crontab这个文件,配置的定时任务并不会立即生效,你需要重新加载下配置然后重启crond服务才行(增加或移除都要重复动作)。这个行为必须使用sudo命令或root账户。
/etc/init.d/cron reload
/etc/init.d/cron restart
3.crontab命令
crontab命令可以采用交互式或是使用预先写好的文件。默认每个人都有一个自己的文件,命令执行不需要root权限。先看下命令的帮助
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
-e是打开交互界面 -l是列出已经有的任务 -r删除已有的任务(注意是全部) -i删除已有的任务(和r搭配使用,带确认提示y/n)
注:这种方式生成的任务保存在/var/spool/cron/crontabs/目录里面,每个用户都有一个自己的文件,所以不需要root权限也能修改。
另外一种方式就是加载预先写好的文件
1、 创建一个文本文件(例如task.cron),写入cron作业后将文件名作为crontab命令的 参数: $ crontab task.cron
2、 或者直接在行内(inline)指定cron作业,不再单独创建文件。例如: $ crontab<<EOF 02 * * * * /home/slynux/script.sh EOF cron作业需要写在crontab<<EOF和EOF之间。
4.工作原理
星号(*)指定命令应该在每个时间单位上执行。也就是说,如果*出现在cron作业中的小 时字段,那么命令就会每小时执行一次。如果你希望在多个时段执行命令,那么就在对应的时间 字段中指定时间间隔,彼此之间用逗号分隔(例如要在第5分钟和10分钟时运行命令,那就在分 钟字段中输入5,10)。斜线(除号)可以让我们以特定的时间间隔运行命令。例如,分钟字段中 出现的0-30/5会在每前半小时内,隔5分钟执行一次命令。小时字段中出现的*/12会每隔12小 时执行一次命令。
执行cron作业所使用的权限同创建crontab的用户的权限相同。如果你需要执行要求更高 权限的命令,例如关闭计算机,那么就要以root用户身份执行crontab命令。
在cron作业中指定的命令需要使用完整路径。这是因为cron并不会执行用户的.bachrc,所 以执行cron作业时的环境与终端所使用的环境不同,环境变量PATH可能都没有设置。如果命令 运行时需要设置某些环境变量,必须明确地进行设定。
5.其它用法
crontab命令还包括其他一些选项。
- 指定环境变量
很多命令需要正确地设置环境变量才能够运行。cron命令会将SHELL变量设置为/bin/sh, 还会根据/etc/passwd设置LOGNAME和HOME。如果还需要其他的环境变量,可以在crontab中 定义。环境变量可以针对所有作业设置,也可以针对个别作业设置。 如果定义了环境变量MAILTO,cron就可以通过电子邮件将命令输出发送给用户。 crontab通过在用户的cron表中插入一行变量赋值语言来定义环境变量。 下面的crontab定义了环境变量http_proxy,以便于使用代理服务器访问Internet:
http_proxy=http://192.168.0.3:3128
MAILTO=user@example.com
00 * * * * /home/slynux/download.sh
Debian、Ubunto和CentOS发行版中的vixie-cron支持这种格式。对于其他发行版,可以针 对每个命令设置环境变量:
00 * * * * http_proxy=http:192.168.0.2:3128;
/home/sylinux/download.sh
- 在系统启动时运行命令
有时候需要在系统启动时运行特定的命令。有些cron实现支持@reboot字段,可以在重启 过程中执行作业。注意,并不是所有的cron实现都支持这种特性,在一些系统中,只有root用户 可以这样做。现在检查下面的代码:
@reboot command
这样就会以你的用户身份在重启时运行指定的命令。
6.补充内容
最后说下系统自带的几个定时任务 cron.hourly --每小时执行一次 cron.daily --每天执行一次 cron.weekly --每周执行一次 cron.monthly --每月执行一次
总结
乍一看命令挺多挺杂的,实际上蛮简单的。
|