Linux计划任务从入门到实战
一、什么是计划任务?
简单来说,就是让电脑在指定时间自动执行命令或脚本。比如:
- 每天凌晨备份数据库
- 每周清理一次临时文件
- 某个具体时间点发送邮件
Linux有两种主要的计划任务:
- 一次性任务(执行一次就结束,比如"明天早上8点发通知")
- 周期性任务(按固定频率重复执行,比如"每天凌晨3点备份")
二、一次性任务:at命令(简单易用)
1. 先启动服务(重要!)
# 检查服务是否运行(会显示active表示正常)
systemctl status atd
# 如果没启动,输入以下命令启动
sudo systemctl start atd
# 建议设置开机启动(避免重启后失效)
sudo systemctl enable atd
2. 基本用法(3步搞定)
场景:30分钟后,把当前目录的文件列表保存到/root/files.txt
# 第1步:输入at命令 + 执行时间(这里用"30 minutes"表示30分钟后)
at now + 30 minutes
# 会进入一个输入界面,光标闪烁时输入要执行的命令
# 第2步:输入具体命令(按回车换行,可输入多条命令)
ls > /root/files.txt # 列出当前目录文件并保存到指定位置
date >> /root/files.txt # 把执行时间也记录下来(可选)
# 第3步:按Ctrl+D结束输入,任务就创建好了!
3. 常用时间格式(初学者必记)
时间描述 | 示例命令 |
---|---|
具体时间点 | at 14:30 (今天下午2点30分) |
明天同一时间 | at tomorrow |
3天后上午9点 | at 9am + 3 days |
1小时后 | at now + 1 hour |
4. 管理已创建的任务
# 查看所有等待执行的任务(会显示任务编号、时间、用户)
atq
# 删除指定任务(比如删除编号为1的任务)
atrm 1
三、周期性任务:crontab(最常用!)
1. 核心概念:5个时间字段
格式:分 时 日 月 周 要执行的命令
每个位置代表不同的时间单位,用*
表示"任意值"
举个栗子🌰:
# 每天凌晨3点执行备份脚本
0 3 * * * /root/backup.sh
# 解释:
# 0 分 → 3点整执行(分钟为0)
# 3 时 → 凌晨3点
# * 日 → 任意日期
# * 月 → 任意月份
# * 周 → 任意星期
2. 快速入门:3步创建第一个任务
场景:每天早上8点,自动清理临时文件夹/tmp
第1步:编辑任务列表(不同用户需注意权限)
# 普通用户(只能管理自己的任务)
crontab -e
# 管理员(可以管理所有用户任务,建议新手先用管理员练习)
sudo crontab -e
第2步:添加任务(按i键进入编辑模式,输入以下内容)
0 8 * * * rm -rf /tmp/* # 每天8点删除/tmp下所有文件
第3步:保存退出(按Esc键,输入:wq回车)
3. 时间字段详细说明(新手必学)
字段 | 范围 | 特殊符号举例 | 含义解释 |
---|---|---|---|
分钟 | 0-59 | */10 |
每10分钟执行一次 |
小时 | 0-23 | 8-10 |
8点、9点、10点执行 |
日期 | 1-31 | 1,15 |
每月1号和15号执行 |
月份 | 1-12 | 6 |
6月执行(也可用英文缩写jun) |
星期 | 0-6(0=日) | 1 |
每周一执行(1代表周一) |
更多示例:
# 每小时的第15分钟执行(比如9:15、10:15)
15 * * * * command
# 每周六、日的晚上10点执行
0 22 * * 6,0 command
# 每月1号的凌晨1点执行
0 1 1 * * command
4. 脚本执行注意事项(新手常踩坑!)
① 脚本必须有执行权限
# 假设脚本路径是/root/clean.sh
chmod +x /root/clean.sh # 赋予执行权限
② 用绝对路径(避免找不到文件)
# 错误:直接写脚本名(可能找不到)
* * * * * clean.sh
# 正确:写完整路径
* * * * * /root/clean.sh
③ 记录日志(方便排查问题)
# 把执行结果和错误信息保存到日志文件
* * * * * /root/clean.sh >> /var/log/clean.log 2>&1
四、系统级任务:管理员专属(选学)
如果你是管理员,除了crontab -e
,还可以直接编辑系统级配置文件:
1. 所有用户的任务:/etc/crontab
格式比普通用户多一个用户名
字段:
# 示例:每天凌晨4点,以root用户清理日志
0 4 * * * root rm -rf /var/log/*.log
2. 按周期执行的目录
系统自带一些自动执行的目录,把脚本放进去即可:
- 每小时执行:
/etc/cron.hourly/
- 每天执行:
/etc/cron.daily/
- 每周执行:
/etc/cron.weekly/
- 每月执行:
/etc/cron.monthly/
# 操作步骤:
1. 把脚本复制到对应目录:sudo cp myscript.sh /etc/cron.daily/
2. 赋予执行权限:sudo chmod +x /etc/cron.daily/myscript.sh
五、排错指南(新手必备)
1. 任务没执行?先查这3点!
① 服务是否运行:
# 检查crontab服务(周期性任务)
systemctl status crond
# 检查at服务(一次性任务)
systemctl status atd
② 时间格式是否正确:
用Cron表达式生成器验证你的时间设置,避免手滑输错。
③ 脚本是否有错误:
单独运行脚本,查看是否报错(比如路径错误、权限不足)。
2. 查看执行日志(关键!)
# 查看所有计划任务的日志(包括crontab和at)
sudo tail -f /var/log/cron
六、工具对比(新手怎么选?)
工具 | 适合场景 | 难度指数 | 一句话总结 |
---|---|---|---|
at | 一次性任务(比如定时发通知) | ★☆☆☆☆ | 简单!指定时间执行一次 |
crontab | 周期性任务(比如每天备份) | ★★☆☆☆ | 最常用!按固定频率重复执行 |
systemd | 复杂任务(需高精度或依赖管理) | ★★★☆☆ | 进阶工具,适合服务器复杂场景 |
新手建议:先用crontab
掌握周期性任务,再学at
做一次性任务,足够应对90%的日常需求!
七、实战案例:完整走一遍流程
案例:每周一凌晨2点备份MySQL数据库
1. 创建备份脚本(保存为/root/mysql_backup.sh)
#!/bin/bash
# 定义数据库信息
DB_USER=root
DB_PASS=123456
DB_NAME=mydb
BACKUP_DIR=/backup
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
# 执行备份(文件名包含日期,比如mydb_20250414.sql)
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/mydb_$(date +%Y%m%d).sql
2. 赋予脚本执行权限
chmod +x /root/mysql_backup.sh
3. 添加crontab任务
crontab -e # 或sudo crontab -e
# 添加以下内容(每周一凌晨2点执行)
0 2 * * 1 /root/mysql_backup.sh
4. 验证任务(查看日志)
tail -n 10 /var/log/cron # 看到类似以下内容就成功啦!
Apr 14 02:00:01 localhost crond[1234]: (root) CMD (/root/mysql_backup.sh)
八、总结:新手必记3句话
- 一次性任务用at:简单指定时间,执行一次就结束
- 周期性任务用crontab:记住
分 时 日 月 周
五个时间字段,用*
表示任意值 - 脚本执行要注意:用绝对路径、加执行权限、记日志