周期性任务计划: Crontab
文中部分内容摘自骏马金龙的博客,查看可点击
1. crontab简述
- crontab命令用于周期性的执行任务,想要执行这个命令,需要首先启动crond(守护进程)服务才行
- crontab是配置管理crontab file的功程序,也可以移除或列出用于为 cron 提供服务的现有表项
- crontab file存在于多处,包括系统定时任务文件/etc/crontab和/etc/cron.d/*,还有独属于各用户的任务文件/var/spool/cron/USERNAME
cron的守护进程(daemon)
Centos7可以使用以下方式查看,Centos6可以使用:service crond status
看到enable和running即可
[root@Centos7 ~]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-09-05 15:14:24 CST; 1h 9min ago
Main PID: 1437 (crond)
CGroup: /system.slice/crond.service
└─1437 /usr/sbin/crond -n
Sep 05 15:14:24 Centos7.4 systemd[1]: Started Command Scheduler.
Sep 05 15:14:24 Centos7.4 systemd[1]: Starting Command Scheduler...
Sep 05 15:14:24 Centos7.4 crond[1437]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 80% if used.)
Sep 05 15:14:25 Centos7.4 crond[1437]: (CRON) INFO (running with inotify support)
运行进程与设置开机自启
Centos7
[root@Centos7 ~]# systemctl start crond.service
[root@Centos7 ~]# systemctl enable crond.service
Centos6
[root@Centos7 ~]# service crond start
[root@Centos7 ~]# chkconfig --livel 3 crond on
2. crontable file
crondtab file为任务定义文件
- 在此文件中,空行会被忽略,首个非空白字符且以#开头的行为注释行,但#不能出现在行中。
- 可以在crontab file中设置环境变量,方式为"name=value",等号两边的空格可随意,即"name = value"也是允许的。但value中出现的空格必须使用引号包围。
- 默认crond命令启动的时候会初始化所有变量,除了某几个变量会被crond daemon自动设置好,其他所有变量都被设置为空值。自动设置的变量包括SHELL=/bin/sh,以及HOME和LOGNAME(在CentOS上则称为USER),后两者将被默认设置为/etc/passwd中指定的值。其中SHELL和HOME可以被crontab file中自定义的变量覆盖,但LOGNAME不允许覆盖。当然,自行定义的变量也会被加载到内存。
- 除了LOGNAME/HOME/SHELL变量之外,如果设置了发送邮件,则crond还会寻找MAILTO变量。如果设置了MAILTO,则邮件将发送给此变量指定的地址,如果MAILTO定义的值为空(MAILTO=""),将不发送邮件,其他所有情况邮件都会发送给crontab file的所有者。
- 在系统定时任务文件/etc/crontab中,默认已定义PATH环境变量和SHELL环境变量,其中PATH=/sbin:/bin:/usr/sbin:/usr/bin。
- crond daemon每分钟检测一次crontab file看是否有任务计划条目需要执行。
2.1 cron任务分两类
- 系统cron任务:主要用于实现系统自身的维护
- 只能手动编辑/etc/crontab文件,不能使用crontab命令
- 用户cron任务:
- 可以通过编辑/var/spool/cron/USERNAME文件
- 也可以通过命令crontab -e来进行,此种方式带语法检查功能,推荐此种方式
2.2 系统cron的配置格式:/etc/crontab
[root@Centos7 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin ##cron任务只能识别这几个路径下的命令,如果命令不在这几个目录中,就会找不到命令,所以建议使用全路径
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
这个文件中包含如下信息:
- SHELL:周期执行任务用的shell
- PATH:命令路径
- MAILTO:执行结果发送给哪个用户
- * * * * * 分别表示:分、时、日、月、周
- username:执行命令的用户(用户cron任务没有)
- command to be executed:周期执行的任务/命令,在默认情况下命令会根据/etc/crontab中指定的PATH路径进行查找,所以建议使用全路径
2.3 时间表示法
(1)特定值:
给定时间点有效取值范围内的值;
Note:day of week 和 day of month一般不同时使用
Note:如果定义的日和周冲突了,则会多次执行(不包括因为*号导致的冲突)。例如每月的15号执行该任务,同时又定义了周三执行该任务,正常无冲突情况下,将在周三和每月15号执行,但如果某月的15号同时是周三,则该任务在此日执行两次。因此,应该尽力避免同时定义周和日的任务
(2) *
给定时间点上有效取值范围内的所有值;表示每...(每分钟0-59、每小时0-24、每天1-29/30/31、每月1-12、每周0-6)
(3)离散取值:,
在时间点上使用逗号分隔的多个值
#,#,#
(4)连续取值:-
在时间点上使用“ - ”连接开头和结束
#-#
(5)在指定时间点上,定义步长
/#:#即步长
Note:
(1)指定的时间点不能被步长整除时,其意义将不复存在
(2)最小时间单位为“分钟”,想完成“秒”级人物,需要额外借助于其他机制
定义成每分钟任务:再利用脚本实现在每分钟内,循环多次
另外一个需要注意的时间段设置是,使用*号问题。例如"* */2 * * *",它表示每隔两小时后的每一分钟都执行任务,也就是凌晨0点的每分钟执行任务,凌晨1点不执行任务,凌晨2点的每分钟执行任务,凌晨4点的每分钟执行任务,依此类推。同理,"*/5 */2 * * *"表示每隔2小时后的每5分钟执行一次任务。
实例
3 * * * * 每小时的第3分钟执行一次
3 4 * * * 每周五的04:03执行一次
5 6 7 * * 每月7号的06:05执行一次
7 8 9 10 * 每年10月9日的08:07执行一次
9 8 * * 3,7 每周三和周日的08:09执行一次
00 8,20 * * 3,7 每周三和周日的8:00和20:00执行一次
0 9-18 * * 1-5 工作日的工作时间
*/2 * * * * 每2分钟执行一次
*/7 * * * * 每7分钟执行一次(60除7除不开,所以最后一次是间隔4分钟就执行了,然后下面一小时重新执行)
*/30 * * * * 每半小时执行一次
00 */2 * * * 没两个小时的整点执行一次
3. crontab命令使用
NAME
crontab - maintains crontab files for individual users
SYNOPSIS
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c
OPTIONS
-e 编辑任务
-l 列出当前用户的crontab任务都有什么
-r 移除所有任务,即删除/var/spool/cron/USERNAME文件(推荐使用#进行注释,或者直接删除相应条目)
-i 在使用-r选项移除所有任务时提示用户确认
-u 指定编辑哪个用户的crontab
Note:运行结果以邮件通知给当前用户;如果拒绝接受邮件可以:
- COMMAND > /dev/null ##将正确的执行结果发送给null
- COMMAND &> /dev/null ##将正确与错误的执行结果发送给null
Note:定义COMMAND时,如果命令需要用到%,需要对其转义;因为直接使用%表示换行的特殊意义,且第一个%后的所有字符串将当作命令的标准输入。
思考:某任务在指定的时间因关机未能执行,下次开机会不会自动执行?
不会执行,只能等待下一个时间节点
如果期望某时间因故未能按时执行,下次开机后无论是否到了响应时间点都要执行一次,可使用anacron实现
EXAMPLES
1、每12小时备份一次/etc目录至/backup目录中,保存文件 名称格式为“etc-yyyy-mm-dd-hh-MM-SS.tar.gz”
00 */12 * * * /bin/tar -zcf /backup/etc-$(date "+\%F-\%H-\%M-\%S").tar.gz /etc
2、每周2、4、7备份/var/log/secure文件至/logs目录中,文件名格式为“secure-yyyymmdd.tar.gz”;
* * * * 2,4,7 /bin/tar -zcf /log/secure-$(date +\%F).tar.gz /var/log/secure
3、每年9月份的10号到24号这段时间,每2小时取出当前系统/proc/meminfo文件中以S或M开头的行信息,追加至/tmp/meminfo.txt文件中
00 */2 9-24 10 * /bin/egrep "^(S|M)" /proc/meminfo >> /tmp/meminfo.txt 2>/dev/null
4. crontab执行不成功的排查方式
1、查看crontab的日志文件/var/log/cron
[Allen@Centos7 ~]$ sudo tail -f /var/log/cron
Sep 6 09:14:01 Centos7 CROND[24490]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:15:01 Centos7 CROND[24510]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:15:01 Centos7 CROND[24511]: (Allen) CMD (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1)
Sep 6 09:16:01 Centos7 CROND[24535]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:17:01 Centos7 CROND[24552]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:18:01 Centos7 CROND[24569]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:19:01 Centos7 CROND[24586]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:20:01 Centos7 CROND[24605]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:20:01 Centos7 CROND[24606]: (Allen) CMD (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1)
Sep 6 09:21:01 Centos7 CROND[24670]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
2、使用crond命令的调试
参考骏马金龙博客
周期性任务计划: Crontab的更多相关文章
- linux系统的任务计划crontab使用详解
linux系统的任务计划crontab使用详解 其实大部分系统管理工作都是通过定期自动执行某一个脚本来完成的,那么如何定期执行某一个脚本呢?这就要借助linux的cron功能了. 关于cron任务计划 ...
- linux任务计划及周期性任务计划
相关命令:at.batch.cron.mailx 未来某时间执行一次任务:at, batch 周期性运行某任务: cron 一.未来某时间执行一次任务:at命令 at, batch, atq, atr ...
- linux计划crontab
linux计划crontab 启动crontab服务 一般启动服务用 /sbin/service crond start 若是根用户的cron服务可以用 sudo service crond sta ...
- Linux运维技术之详解任务计划(crontab命令)
crontab命令 按照预先设置的时间周期(分钟.小时.天……)重复执行用户指定的命令操作,属于周期性计划任务 (1).先来看一下/etc/crontab文件的内容: [root@localhost ...
- Linux 任务计划 crontab 配置概要与常见问题
Linux 可以利用 crontab 来实现定时任务,自动化操作.本文对此进行简要说明. crontab 操作示例 列出定时任务 crontab -l #列出所有的定时任务,如果没有定时任务,返回 ...
- linux:任务计划crontab
crontab 简介 crontab 命令常见于 Unix 和类 Unix 的操作系统之中(Linux 就属于类 Unix 操作系统),用于设置周期性被执行的指令. crontab 命令从输入设备读取 ...
- 二十三、Linux任务计划及周期性任务执行:at、crontab命令
一.概述 未来的某时间点执行一次某任务:at, batch周期性运行某任务:crontab 这两个任务的执行结果:会通过邮件发送给用户 (本地终端用户之间的邮件通知) centos 5,6,7默认开启 ...
- Linux任务计划及周期性任务执行:at、crontab命令
一.概述 未来的某时间点执行一次某任务:at, batch 周期性运行某任务:crontab 这两个任务的执行结果:会通过邮件发送给用户 (本地终端用户之间的邮件通知) centos 5,6,7默认开 ...
- Linux下计划任务以及crontab权限问题
在Linux工作环境下,我们有时可能会需要在未来某个时间执行某个命令或脚本,但是我们又不可能定个闹钟,然后到点了再去执行吧,这多麻烦.还好我们的Linux系统这么强大,提供了任务计划这个功能,我们就不 ...
随机推荐
- Ecliplse 指定JRE
http://blog.csdn.net/hongweigg/article/details/9987649 在Eclipse启动的过程中,它会去找系统环境变量设置的JRE_HOME或JDK_HOME ...
- Luogu P1429 平面最近点对 【分治】By cellur925
题目传送门 题目大意:给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的.$n$<=100000. $Algorithm$ 最朴素的$n^2$枚举肯定 ...
- [LuoGu]P2664 树上游戏
Portal 这题真的好. 看到树上路径, 脑子里就要点分治 这一题对于每个点都要计算一遍, 如果暴算实在不好算, 这样我们就可以考虑算贡献. 直接计算每种颜色的贡献. 因为一条过重心的路径中, 可能 ...
- AtCoder Grand Contest 012 A
A - AtCoder Group Contest Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statem ...
- 1051 - Good or Bad DFS 记忆化搜索
http://lightoj.com/volume_showproblem.php?problem=1051 对于每个位置,设dfs(cur, one, two)表示前i个字母,拥有辅音字母one个, ...
- solr管理界面下统计多个时间段的数据 facet.query
在Raw Query Parameters参数里面输入时间段即可 如下图所示: facet.query=publishTime:[2017-06-05T00:00:00Z TO 2017-06-07T ...
- poj3204Ikki's Story I - Road Reconstruction(最大流求割边)
链接 最大流=最小割 这题是求割边集 dinic求出残余网络 两边dfs分别以源点d找到可达点 再以汇点进行d找到可达汇点的点 如果u,v为割边 那么s->u可达 v->t可达 并且为饱 ...
- asp.net MVC中实现调取web api
public ActionResult Index(string city) { if (string.IsNullOrEmpty(city)) { city = "上海"; } ...
- 多线程wait和notify实现1212
package threadT; public class ThreadMain { public static void main(String args[]) { final Object obj ...
- hihocoder1736 最大的K-偏差排列
思路: 容易写错的贪心题. 实现: #include <bits/stdc++.h> using namespace std; int main() { int n, k; while ( ...