一、定时任务概述
Linux系统定时任务用于在指定时间自动执行命令或脚本,是自动化运维的重要工具。主要包括cron和at两种方式。
1.1 定时任务类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| cron | 周期性任务 | 定期备份、日志清理 |
| at | 一次性任务 | 延迟执行命令 |
| anacron | 非连续运行系统 | 笔记本、工作站 |
二、cron服务管理
2.1 cron服务
# 安装cron
yum install -y cronie
# 启动服务
systemctl start crond
# 停止服务
systemctl stop crond
# 重启服务
systemctl restart crond
# 查看状态
systemctl status crond
# 开机自启
systemctl enable crond
# 查看日志
tail -f /var/log/cron
# 输出示例
● crond.service – Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled)
Active: active (running) since Mon 2024-01-15 10:00:00 CST
Main PID: 1234 (crond)
● crond.service – Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled)
Active: active (running) since Mon 2024-01-15 10:00:00 CST
Main PID: 1234 (crond)
三、crontab配置
3.1 crontab语法
# crontab格式
# 分钟 小时 日 月 周 命令
# * * * * * command
# 字段说明
分钟: 0-59
小时: 0-23
日: 1-31
月: 1-12
周: 0-7 (0和7都表示周日)
# 特殊字符
* # 任意值
, # 列举多个值
- # 范围
/n # 步长
# 示例
* * * * * command # 每分钟执行
0 * * * * command # 每小时执行
0 0 * * * command # 每天零点执行
0 2 * * * command # 每天凌晨2点执行
0 0 * * 0 command # 每周日零点执行
0 0 1 * * command # 每月1号零点执行
0 0 1 1 * command # 每年1月1号零点执行
*/5 * * * * command # 每5分钟执行
0 9-17 * * * command # 每天9点到17点每小时执行
0 9,12,15 * * * command # 每天9点、12点、15点执行
3.2 crontab命令
# 编辑当前用户的crontab
crontab -e
# 查看当前用户的crontab
crontab -l
# 删除当前用户的crontab
crontab -r
# 编辑指定用户的crontab
crontab -e -u username
# 查看指定用户的crontab
crontab -l -u username
# 从文件导入
crontab cronfile
# 导出到文件
crontab -l > cronfile
# 查看所有用户的crontab
ls /var/spool/cron/
3.3 crontab配置示例
# 编辑crontab
crontab -e
# 添加任务
# 每天凌晨2点备份
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# 每5分钟检查服务
*/5 * * * * /usr/local/bin/check_service.sh
# 每周日凌晨3点清理日志
0 3 * * 0 /usr/local/bin/clean_logs.sh
# 每月1号凌晨1点生成报告
0 1 1 * * /usr/local/bin/monthly_report.sh
# 每小时同步时间
0 * * * * /usr/sbin/ntpdate ntp.aliyun.com
# 工作日早上8点发送通知
0 8 * * 1-5 /usr/local/bin/morning_notify.sh
四、系统级定时任务
4.1 /etc/crontab
# 系统级crontab文件
cat /etc/crontab
# 格式(比用户crontab多一个用户字段)
# 分钟 小时 日 月 周 用户 命令
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 示例
0 2 * * * root /usr/local/bin/backup.sh
*/10 * * * * nginx /usr/local/bin/check_nginx.sh
4.2 定时任务目录
# 定时执行目录
/etc/cron.hourly/ # 每小时执行
/etc/cron.daily/ # 每天执行
/etc/cron.weekly/ # 每周执行
/etc/cron.monthly/ # 每月执行
# 添加每日任务
cat > /etc/cron.daily/backup << 'EOF'
#!/bin/bash
/usr/local/bin/backup.sh
EOF
chmod +x /etc/cron.daily/backup
# 查看执行时间配置
cat /etc/anacrontab
4.3 cron.d目录
# /etc/cron.d/ 目录
# 用于放置独立的cron配置文件
# 创建应用定时任务
cat > /etc/cron.d/myapp << 'EOF'
# MyApp定时任务
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 2 * * * root /usr/local/bin/myapp_backup.sh
*/5 * * * * root /usr/local/bin/myapp_check.sh
EOF
# 设置权限
chmod 644 /etc/cron.d/myapp
五、at一次性任务
5.1 at服务管理
# 安装at
yum install -y at
# 启动服务
systemctl start atd
# 开机自启
systemctl enable atd
# 查看状态
systemctl status atd
5.2 at任务管理
# 在指定时间执行
at 10:00
at> echo "Hello" > /tmp/test.txt
at> # 按Ctrl+D结束
# 在指定日期时间执行
at 10:00 2024-12-31
at 10:00 Dec 31
# 相对时间执行
at now + 1 hour
at now + 30 minutes
at tomorrow
# 从文件读取命令
at -f script.sh now + 1 hour
# 查看任务队列
atq
# 查看任务详情
at -c 1
# 删除任务
atrm 1
六、定时任务权限控制
6.1 允许/拒绝用户
# 允许使用cron的用户
/etc/cron.allow
# 拒绝使用cron的用户
/etc/cron.deny
# 规则优先级
# 1. 如果cron.allow存在,只有列出的用户可以使用
# 2. 如果cron.allow不存在,cron.deny中列出的用户不能使用
# 3. 如果两个文件都不存在,只有root可以使用
# 示例:只允许特定用户
echo "root" > /etc/cron.allow
echo "zhangsan" >> /etc/cron.allow
# 示例:拒绝特定用户
echo "lisi" > /etc/cron.deny
# at的权限控制
/etc/at.allow
/etc/at.deny
七、定时任务调试
7.1 常见问题排查
# 检查cron服务状态
systemctl status crond
# 查看cron日志
tail -f /var/log/cron
# 检查脚本权限
ls -l /usr/local/bin/backup.sh
# 检查脚本语法
bash -n /usr/local/bin/backup.sh
# 手动执行脚本测试
/usr/local/bin/backup.sh
# 检查环境变量
# 在脚本开头添加
#!/bin/bash
. /etc/profile
. ~/.bashrc
# 检查路径问题
# 使用绝对路径
0 2 * * * /bin/bash /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# 检查输出重定向
# 确保正确处理标准输出和错误输出
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
7.2 调试技巧
# 使用logger记录日志
0 2 * * * /usr/local/bin/backup.sh 2>&1 | logger -t backup
# 发送邮件通知
MAILTO=admin@fgedu.net.cn
0 2 * * * /usr/local/bin/backup.sh
# 记录执行时间
0 2 * * * echo "Start: $(date)" >> /var/log/backup.log && /usr/local/bin/backup.sh && echo "End: $(date)" >> /var/log/backup.log
# 添加锁文件防止重复执行
#!/bin/bash
LOCKFILE=/tmp/backup.lock
if [ -f $LOCKFILE ]; then
echo "Backup already running"
exit 1
fi
touch $LOCKFILE
# 执行备份任务
rm -f $LOCKFILE
八、最佳实践
| 实践项 | 建议 |
|---|---|
| 脚本路径 | 使用绝对路径 |
| 日志记录 | 重定向输出到日志文件 |
| 错误处理 | 检查命令返回值 |
| 环境变量 | 在脚本中设置必要变量 |
注意事项:
- 确保脚本有执行权限
- 使用绝对路径避免路径问题
- 正确处理标准输出和错误输出
- 添加日志便于问题排查
九、总结
定时任务是自动化运维的基础。通过本培训文档,您应该掌握了:
学习交流加群风哥微信: itpux-com
- cron服务管理
- crontab语法和配置
- 系统级定时任务配置
- at一次性任务使用
- 定时任务权限控制
- 常见问题排查方法
IT运维培训文档系列 | 第75篇 | Linux系统定时任务管理培训
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
