一、定时任务最常见的几类场景¶
原始笔记中总结了 cron 的典型用途:
- 同步系统时间
- 进行定时备份
- 执行日常循环类操作
- 巡检并发送结果
本文先聚焦最基础也最常见的三类场景:时间同步、目录备份和脚本变量使用。
二、案例一:定时同步系统时间¶
2.1 使用的命令¶
原始示例使用的是:
/sbin/ntpdate ntp1.aliyun.com
2.2 定时任务配置¶
每 2 分钟同步一次系统时间:
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
这里把标准输出和错误输出都重定向到了空设备,避免 cron 反复发送执行输出。
2.3 调试方法¶
可以先故意改错系统时间:
$ date -s '20200101'
等待两分钟后再检查时间:
$ date
2.4 查看 cron 日志¶
$ tail -f /var/log/cron
需要注意的是:cron 日志通常只能告诉你“任务有没有被触发执行”,并不能完整证明“业务逻辑一定执行成功”。
三、案例二:定时备份 /etc/ 目录¶
3.1 先手工验证命令¶
备份目录一般建议放在业务低谷期,比如凌晨 1 点。
手工执行示例:
$ mkdir -p /backup/
$ tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/
3.2 封装成脚本¶
创建脚本目录:
$ mkdir -p /server/scripts/
一个简单脚本可以写成:
#!/bin/bash
tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/
执行测试:
$ sh backup-etc.sh
3.3 加入定时任务¶
调试阶段可以先每分钟执行一次:
* * * * * /bin/sh /server/scripts/backup-etc.sh >/dev/null 2>&1
检查结果时可以使用:
$ watch ls -l /backup/
确认没问题后,再改成正式时间,例如每天凌晨 1 点:
00 01 * * * /bin/sh /server/scripts/backup-etc.sh >/dev/null 2>&1
四、案例三:脚本中的变量怎么配合定时任务使用¶
定时任务越复杂,越不建议把所有逻辑都直接写在 crontab 里。脚本里使用变量可以让内容更清晰,也便于后续维护。
4.1 变量的基本思路¶
在脚本里,像时间、IP、目录名、文件名这类需要重复引用的信息,都适合放进变量里。
变量命名建议:
- 不要用数字开头
- 尽量使用有语义的名字
- 特殊场景下可以用下划线分隔单词
4.2 简单变量示例¶
$ kui="熟能生巧,练习才能掌握"
$ echo $kui
4.3 变量用于目录、文件和命令结果¶
dir=/server/scripts/
file=backup-etc.sh
time=`date +%F_%w`
echo $time
生成带时间的文件名:
time=`date +%F_%w`
touch oldboy-$time.txt
4.4 在备份脚本中使用变量¶
原始笔记给出的变量版备份脚本示例如下:
#!/bin/bash
# 定义变量
time=`date +%F_%w_%H`
# 引用变量进行备份
tar zcf /backup/etc-$time.tar.gz /etc/
这样做的好处是:时间格式只定义一次,后面统一引用,更不容易写错。
五、小结¶
cron 实战里最有价值的一步,往往不是“会写一条计划任务”,而是把任务拆成下面三个层次:
1、先手工执行命令,确认逻辑正确 2、再把命令封装进脚本 3、最后让 crontab 只负责“定时调用脚本”
按照这个顺序做,后续无论是时间同步、目录备份还是更复杂的巡检任务,都会稳很多。