系统定时任务 —— crontab
一、什么是定时任务?
计划任务用于执行周期性操作,例如:
- 凌晨3点备份数据库
- 每天晚上23点开启网站活动接口
- 日志文件切割、系统信息采集等
使用场景:
- 系统级任务:清理临时文件、日志分割等。
- 用户级任务:同步时间、备份配置文件、数据库备份等。
二、安装 crontabs 并启用服务
# 安装 crontabs
yum install -y crontabs
# 设置开机启动
systemctl enable crond
# 启动 cron 服务
systemctl start crond
# 查看状态
systemctl status crond
三、crontab 配置文件说明
| 文件路径 | 说明 |
|---|---|
/var/spool/cron/ | 每个用户的 crontab 文件(以用户名命名) |
/etc/crontab | 系统级 crontab 配置文件 |
/etc/cron.d/ | 存放自定义的 crontab 文件 |
/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/ | 分别对应每小时、每天、每周、每月自动执行的脚本 |
四、crontab 时间格式详解
cron 表达式由五个字段组成,表示时间点:
* * * * *
分 时 日 月 星期
每个字段代表一个时间单位,取值如下:
| 字段 | 取值范围 |
|---|---|
| 分钟 | 0 - 59 |
| 小时 | 0 - 23 |
| 日期 | 1 - 31 |
| 月份 | 1 - 12 |
| 星期 | 0 - 6(0 或 7 表示星期天) |
支持的操作符:
*:任意值(如*在分钟位表示“每一分钟”)-:范围(如5-7表示从第5到第7),:多个不连续值(如1,3,5表示1、3、5)/n:每隔 n 单位时间(如*/10表示每10分钟)
五、常用命令
crontab -e # 编辑当前用户的定时任务
crontab -l # 查看当前用户的定时任务
crontab -r # 删除当前用户的定时任务
crontab -u 用户名 -l # 查看指定用户的定时任务
六、crontab 示例
crontab -e
- 输入以下命令
# 1:每隔1分钟执行一次,将当前时间写入 /tmp/cron_test.log 文件中
# 输入 ` tail -f /tmp/cron_test.log `查看
* * * * * echo "任务执行于:$(date +%Y-%m-%d\ %H:%M:%S)" >> /tmp/cron_test.log
# 2:每隔 20 分钟执行一次关机命令
*/20 * * * * /sbin/shutdown -h now
# 3:每天早上10点重启系统
0 10 * * * root reboot
# 4:每晚21:30重启 smb 服务
30 21 * * * /etc/init.d/smb restart
# 5:每月1、6、25日的4:45重启 smb 服务
45 4 1,6,25 * * /etc/init.d/smb restart
一次性任务管理 —— at 命令
一、安装 at 工具
yum install -y at
二、启动 atd 服务
systemctl start atd # 启动服务
systemctl enable atd # 开机自启
systemctl status atd # 查看状态
三、at 命令语法
at [option] TIME
常用选项:
| 选项 | 说明 |
|---|---|
-V | 显示版本信息 |
-l 或 atq | 列出当前队列中的作业 |
-d 或 atrm | 删除指定作业 |
-c | 查看具体作业内容 |
-f <file> | 从文件中读取任务 |
-m | 强制发送邮件通知任务完成情况 |
时间格式示例:
| 格式 | 说明 |
|---|---|
HH:MM | 当天该时间执行,若已过则次日执行 |
HH:MM YYYY-MM-DD | 指定日期和时间 |
now + 5 minutes | 当前时间加5分钟 |
tomorrow | 明天同一时间 |
noon、midnight、teatime(4pm) | 特殊时间点 |
四、at 使用示例
示例1:1分钟后重命名目录(需先创建原目录)
mkdir /tmp/ca2
cd /tmp
ls
- 设置1分钟后执行重命名:
at now + 1 minute
- 输入以下命令
mv /tmp/ca2 /tmp/at2
按 Ctrl+D 保存退出
示例2:执行多个命令(创建文件、输出内容)
at now + 2 minutes
输入:
echo "This is a test file" > /tmp/test_at.txt
touch /tmp/file1.txt /tmp/file2.txt
按 Ctrl+D 保存退出。
示例3:从文件执行任务
创建一个脚本文件 atcmd:
vi atcmd
写入以下内容:
mkdir cd1
mkdir cd2
mv cd1 cd
mv cd2 cd22
pwd
执行:
at -f atcmd now + 1 minute
示例4:强制发送邮件提醒任务完成
at -m now + 1 minute
输入命令后退出,即使没有输出也会收到邮件通知。
示例5:查看任务列表
at -l
# 或者
atq
示例6:设置白名单允许用户使用 at (可选)
创建 /etc/at.allow 文件并添加允许用户:
vim /etc/at.allow
添加:
xingxing
保存后,只有超级用户和白名单中的用户可以使用 at。
注意:黑名单使用
/etc/at.deny文件。
- 最后结果查看
总结
| 功能 | 工具 | 命令示例 | 说明 |
|---|---|---|---|
| 定时任务 | crontab | crontab -e | 编辑用户的定时任务列表 |
crontab -l | 列出用户的当前定时任务 | ||
| 一次性任务 | at | at now + 5 minutes | 安排一个在5分钟后执行的一次性任务 |
| 查看任务 | crontab | crontab -l | 查看当前用户的所有定时任务 |
| at | atq | 列出所有等待执行的一次性任务 | |
| 删除任务 | crontab | crontab -r | 删除当前用户的所有定时任务 |
| at | atrm [job_number] | 根据任务编号删除指定的一次性任务 |