-
概述
- cron 相关的理解与使用
-
背景
-
最近实在没啥写的了
- 我写东西, 一般是是这些
- 看了书过后, 做一些系统的整理
- 比如之前的 docker 和 git 系列
- 遇到了实际问题, 解决过程也不是那么顺利, 中间经历了一些求助与试错
- 一般就是先看异常, 再去百度, 找到有网友的解决方案, 自己照着做一遍, 然后洗稿...
- 看了书过后, 做一些系统的整理
- 我写东西, 一般是是这些
-
最近在回顾 jojo 的奇妙冒险
- 里面一众时间系的能力, 让我大呼牛逼
-
于是, 在这个暂时找不到东西写的时间里, 我决定写一下 cron
- 兄弟, 能划水的东西写一个, 少一个, 你得加紧看书啊..
-
回想起早年的一些遗留问题
- 我用 cron, 用 crontab 命令写配置
- 能用但是查不到配置
- 我同事直接在 /etc/crontab 下写配置
- 当然能用
- 还比我的简单
- 是时候整理一下了
- 我用 cron, 用 crontab 命令写配置
-
-
准备
- os
- centos 7
- os
1. 一些场景
-
概述
- 列举一些场景
-
场景
-
我想在 某个特定的时间, 做某件事
- 比如
- 在 2019-12-31 23:59:59, 打印一句 Goodbye 2019
- 在 2019-12-07 22:42:18, 定时开机
- 你这是在为难我 linux
- 不过定时关机, 貌似是可以
- 比如
-
我想在 按照某个特定的频率, 执行某个操作
- 比如
- 在 每一秒, 打印一下当前时间
- 在 每分钟的 30 秒, 打印时间
- 在 每小时的 30 分, 打印时间
- 在 每一天的 18 点, 打印时间
- 在 每个月的 15 日, 打印时间
- 在 每一周的 星期三, 打印时间
- 在 每一年的 1月1日, 打印时间
- 比如
-
-
处理方法
-
人工
- 到时候定个闹钟, 然后运维去执行脚本
- 闹钟可能定错
- 运维可能没空
- 到时候定个闹钟, 然后运维去执行脚本
-
自动
- 事先准备好脚本
- 事先设定好时间
- 让 linux 自己去执行
-
怎么想, 都是后面那个靠谱
- 只要 服务器 开着, 就不会有问题
- 这块的工具, 确实有
- linux 上, 它叫做 cron
-
-
关于 cron 的名字
-
wikipedia 上, 是这么描述的
# cron 名字的来源, 是希腊语单词 时间, χρόνος.
# 这单词咋读, 好像同 Chronos
# 希腊神话里的时间之神 柯罗诺斯
# 不过他和 宙斯他爹 克诺洛斯, 不是同一个人, 也没啥关系...
The origin of the name cron is from the Greek word for time, χρόνος.
-
2. crontab 与 crond
-
概述
- 简介和比较 crontab 和 crond
-
场景
-
在虚机上, 当我尝试输入 cron 时, 出现了两个命令
- crond
- crontab
-
尝试
- help
- 两个命令的 help 输出不一样
- which
- 发下他们的路径, 也不一样
- help
-
结论
- crond 和 crontab, 是两个不同的东西
-
-
二者关系
-
crontab
- cron 的前台命令行
- 用来操作 crontable
- crontable 是记录每个用户 cron 命令行的脚本
- cron 的前台命令行
-
crond
- cron 的后台进程
- 通常是系统自带, 开机启动
- 每隔一段时间, 就会去扫描用户的 crontable
- 然后执行 crontable 中的语句
- cron 的后台进程
-
总结
- crond 和 crontab 是 cron 的组成部分
- crontab 是前台命令行
- crond 是后台守护进程
- crond 和 crontab 是 cron 的组成部分
-
3. 任务调度
-
概述
- 简述 linux 的任务调度
-
任务调度
-
系统任务调度
-
概述
- 操作系统周期执行的 任务调度
- 这个简单了解一下
-
相关文件
-
系统日志相关
# 系统日志
# 这块我暂时了解不多, 不详细接受
/etc/logrotate.d/syslog -
cron 相关
# 系统使用的 cron 文件
# 不建议用户使用
# 里面有 格式描述
/etc/crontab
# 这里面也是 系统的人物
/etc/cron.d/
# 下面也是
cron.daily
cron.hourly
cron.monthly
crontab
cron.weekly
-
-
-
用户任务调度
-
概述
- 每个用户, 有自己的任务调度
- 这个才是我们要用到的东西
-
相关文件
-
cron 配置
# 配置名字, 就是用户名
# 按用户隔离
/var/spool/ -
权限
# 这俩目前怎么生效, 我暂时还不明白
/etc/cron.deny
/etc/cron.allow
-
-
-
4. cron 配置简述
-
概述
- 简述 cron 配置的写法
-
位置
-
示例
# 这个是例子, 最好不要在这里直接加
/etc/crontab -
实际文件
# 刚开始可能是空的, 后面会加上
/var/spool/cron/
-
-
语法
-
变量
# 指定 shell
SHELL=/bin/bash
# 指定 path
# 没有指定的话, 命令需要带 完整路径
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 指定 mailto
MAILTO=root -
格式
-
时间
- 字段
- 分
- 取值范围
- 0 - 59
- 取值范围
- 时
- 取值范围
- 0 - 23
- 取值范围
- 日
- 取值范围
- 1 - 31
- 取值范围
- 月
- 取值范围
- 1 - 12
- 取值范围
- 天
- 取值范围
- 0 - 7
- 取值范围
- 分
- 字段
-
用户
- 指定 执行用户
- 注意, 此处有坑
- 这个配置, 在 crontab 中需要指定
- 在 /var/spool/cron 下不需要指定
- 指定了反而会出错
- 注意, 此处有坑
- 指定 执行用户
-
命令
- 指定执行命令
-
-
例子
# 不适用 crontab
# 使用 root 的 cron 配置
# 每分钟 向 log 文件后追加 hello
# 可以配合环境变量
# 也可以 先用 which 命令, 查找 echo 的真实路径
* * * * * /usr/bin/echo 'hello' >> /root/log
-
5. 操作
1. crond
-
准备
- cron 配置的执行, 前提是 crond 的启动
-
命令
# 确认
> systemctl status crond
# 启动
> systemctl start crond
# 关闭
> systemctl stop crond
# 重启
> systemctl restart crond
2. crontab
-
概述
- 操控 cron 命令
-
命令
# 1. 查看当前用户的 cron 配置
# 也可以把输出内容重定向, 用来做备份
> crontab -l # 2. 如果是 root 用户, 则可以指定自己或者其他
# 后面的命令, 也可以加 -u, 我就不多描述了
> crontab -u <user> -l # 3. 编辑 cron 配置
# 配合会写到 /var/spool/cron/<usr>
> crontab -e # 4. cron 配置读入
# 配置可以有 命令1 构造
> crontab <filename>
3. 日志文件
-
概述
- 可以查看 cron 执行的日志文件
-
路径
/var/log/cron
6. 其他
- cron 的使用, 感觉还是比较广泛的
- quartz
- 这个组件可以实现类似的功能
- 好像是 java
- 这个组件可以实现类似的功能
- quartz
ps
-
ref
-
-
很不错的东西
- 实在不想写, 可以让他帮你做
- 也可以在学习的时候, 用来做 标准答案
-
注意
- crontab 下的 cron 表达式, 没有 second 这个维度, 直接从 mintue 开始
- 不要搞错了
- crontab 下的 cron 表达式, 没有 second 这个维度, 直接从 mintue 开始
-
-
- 深入到了 cron 的运行原理
- 我现在还不敢看, 愿它能给足够强大或者感兴趣的你带来帮助
- 博主在 cron 算是经验丰富, 很强大的人
-
- 明确区分了 任务调度 的种类
- 这个真的开拓了视野
- 明确区分了 任务调度 的种类
-
- cron.deny 和 cron.allow 的讲解
- 结尾处的 日志
-
-
后续
- 系统日志
- 系统任务
- cron 表达式语法