008 Linux Shell 入门教程(八):任务调度与自动化
Linux 提供了一套简单却强大的任务调度机制,最核心的工具就是:cron 和 crontab。通过这套机制,我们可以实现:
- 每天凌晨备份数据库
- 每小时清理临时文件
- 每分钟监控服务状态
- 每周自动更新日志归档
一、什么是 cron 与 crontab?
工具 | 作用 |
cron | Linux 的任务调度守护进程,后台持续运行 |
crontab | 用户级别的任务调度表,配置计划任务的命令 |
二、cron 时间格式详解
crontab 使用一种特定格式来定义任务执行的时间,共 5 个时间字段:
分 时 日 月 星期 命令
字段 | 范围 | 示例 |
分钟(minute) | 0–59 | 30 表示半点 |
小时(hour) | 0–23 | 4 表示凌晨 4 点 |
日期(day) | 1–31 | 15 表示每月15号 |
月份(month) | 1–12 | 8 表示 8 月 |
星期(week) | 0–7 | 0 或 7 都表示星期日 |
星号 * 表示“每”。例如 * * * * * 表示“每分钟都执行”。
示例时间表达式
表达式 | 含义 |
0 3 * * * | 每天凌晨 3 点执行 |
*/5 * * * * | 每 5 分钟执行一次 |
0 0 * * 0 | 每周日 0 点执行 |
30 9 1 * * | 每月 1 号上午 9:30 执行 |
三、使用 crontab 添加计划任务
1. 编辑当前用户的计划任务:
crontab -e
首次使用会让你选择编辑器(如 vim、nano)。
2. 添加一个任务示例:
0 2 * * * /home/user/backup.sh
含义:每天凌晨 2 点执行 backup.sh 脚本。
3. 查看当前任务:
crontab -l
4. 删除当前任务表:
crontab -r
四、日志记录与调试
系统日志位置:
不同系统略有差异,常见日志文件包括:
- /var/log/cron
- /var/log/syslog
- /var/log/messages
查看日志:
grep CRON /var/log/syslog
五、crontab 中常见坑及调试建议
1. 路径问题
cron 执行的命令没有默认 shell 环境变量,所以推荐使用绝对路径。
/usr/bin/python3 /home/user/script.py
或者在脚本中手动设置 PATH:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
2. 权限问题
确保脚本有执行权限:
chmod +x your_script.sh
3. 输出未查看
可以将输出重定向到日志文件中:
0 1 * * * /path/to/script.sh >> /var/log/myscript.log 2>&1
六、使用特殊字符串定义任务
crontab 支持一些特殊关键字:
关键字 | 等价表达式 | 含义 |
@reboot | - | 系统启动时执行一次 |
@daily | 0 0 * * * | 每天 |
@hourly | 0 * * * * | 每小时 |
@weekly | 0 0 * * 0 | 每周日 |
@monthly | 0 0 1 * * | 每月 1 日 |
@yearly | 0 0 1 1 * | 每年元旦 |
七、综合实战:自动备份日志脚本
脚本示例:backup_log.sh
#!/bin/bash
log_dir="/var/log/nginx"
backup_dir="/backup/logs"
mkdir -p $backup_dir
cp $log_dir/*.log $backup_dir/$(date +%F_%H-%M-%S)_logs.tar.gz
设置定时任务:
0 3 * * * /home/user/backup_log.sh >> /home/user/backup.log 2>&1
效果:每天凌晨 3 点自动备份 nginx 日志并输出到日志文件。
八、系统级任务调度
除了 crontab -e 为用户设置的计划任务,系统还有:
- /etc/crontab:系统级调度任务文件
- /etc/cron.* 目录:
目录 | 含义 |
/etc/cron.hourly/ | 每小时运行 |
/etc/cron.daily/ | 每天运行 |
/etc/cron.weekly/ | 每周运行 |
/etc/cron.monthly/ | 每月运行 |
将脚本放进这些目录即可按周期运行。
九、小结
技能点 | 内容 |
任务调度工具 | cron, crontab |
时间格式 | 分 时 日 月 周 |
脚本调度 | 使用绝对路径 + 权限 |
日志调试 | 查看 /var/log/syslog 等 |
系统任务 | /etc/cron.* 目录 |
下一篇预告:
Linux Shell 入门教程(九):Shell 脚本项目实战:自动备份 + 邮件通知
下一篇,我们将通过一个完整的项目,把学过的内容整合:实现定时自动备份、压缩、上传并发送通知邮件的功能,正式进入实战阶段!