linux计划任务

计划任务

计划任务是计算机系统中用于自动执行指定命令或脚本的功能

  1. 计划任务的作用
    • 定时备份数据、清理日志
    • 定期运行系统维护脚本
    • 自动化软件更新
    • 周期性生成报告
  2. Linux中的两类计划任务
    • 周期性任务(cron):按固定时间间隔(分钟/小时/日/月/周)重复执行。
    • 一次性任务(at):在指定时间点执行一次。
工具 适用场景 时间粒度 特点
cron 周期性重复任务 分钟级调度 配置灵活,日志完善
at 单次未来任务 秒级调度 简单快速,无持久化配置
systemd 现代Linux系统 依赖少,集成系统日志

at命令

  • 作用:在指定时间点执行一次性任务(与cron的周期性任务互补)
  • 典型场景
    • 下班后自动重启服务
    • 定时发送提醒邮件
    • 在低峰期执行资源密集型操作(如数据压缩)

语法

at [时间选项] [日期选项]

常用时间格式

类型 示例 说明
绝对时间 at 14:30 当天14:30执行
at 23:59 2025-08-10 指定日期时间
相对时间 at now + 2 hours 2小时后执行
at now + 30 minutes 30分钟后执行
自然语言 at teatime 下午16:00 (内置时间别名)
at tomorrow 明天同一时间
组合时间 at 9:00 AM next week 下周一上午9点

内置时间别名

  • midnight(00:00), noon(12:00), teatime(16:00)

任务管理命令

命令 作用
atq 查看等待执行的at任务队列
atrm [任务ID] 删除指定任务(e.g. atrm 4
at -c [任务ID] 查看任务详情(包含环境变量)

cron命令

架构

组件 路径 作用
守护进程 /usr/sbin/crond 后台服务,扫描并执行任务
系统级配置 /etc/crontab 全局任务(需指定用户)
用户级配置 /var/spool/cron/ 用户通过crontab创建的任务
预设目录 /etc/cron.{hourly,daily,weekly,monthly} 按周期执行的脚本目录
日志文件 /var/log/cron 任务执行记录(CentOS/RHEL)

语法配置

[root@wickt 桌面]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed



* * * * * 用户名 命令
分钟 小时 日 月 星期
分时日月周

符号解析

符号 示例 含义
* * * * * * 每分钟执行
, 0 8,12,18 * * * 每天8点/12点/18点执行
- 0 9-17 * * 1-5 工作日9点到17点每小时执行
*/n */15 * * * * 每15分钟执行
L 0 0 L * * 每月最后一天执行(仅某些系统)

示例

0 3 * * *   /backup.sh         # 每天3:00备份
*/5 * * * * /monitor.sh # 每5分钟监控
0 0 1 * * /billing.sh # 每月1日0点结算
0 12 * * 1 /report.sh # 每周一12点生成报告
30 4 1,15 * * /update.sh # 每月1号和15号4:30更新

命令

命令 作用
crontab -e 编辑当前用户的任务(使用默认编辑器)
crontab -l 列出当前用户的所有任务
crontab -r 删除当前用户的所有任务(慎用!)
crontab -u username [参数] 管理其他用户的任务(需root权限)
crontab -l > mycron.backup 导出任务备份
crontab mycron.conf 从文件导入任务(覆盖原有)
crontab -i 编辑时交互提示
crontab -d 删除用户任务(旧版用法)

at与cron对比

特性 at cron
执行次数 一次性 周期性
配置方式 命令行交互 编辑crontab文件
任务管理 atq/atrm crontab -e
适用场景 临时任务 常规维护任务
环境继承 继承当前Shell环境 使用精简环境

date命令

核心功能

  1. 查看时间:显示当前系统时间
  2. 设置时间:修改系统时钟(需 root 权限)
  3. 日期计算:对时间进行加减操作
  4. 格式转换:自定义时间显示格式

语法

date [选项]... [+格式]           # 显示时间
date [选项] [MMDDhhmm[[CC]YY][.ss]] # 设置时间

时间格式化

符号 含义 示例输出
%Y 4位年份 2025
%y 2位年份 25
%m 月份 (01-12) 08
%d 日 (01-31) 09
%H 24小时制小时 15
%I 12小时制小时 03
%M 分钟 (00-59) 30
%S 秒 (00-60) 45
%A 完整星期名 Saturday
%a 缩写星期名 Sat
%B 完整月份名 August
%b 缩写月份名 Aug
%Z 时区名 CST
%z 时区偏移 +0800
%s Unix 时间戳 1754757045
%N 纳秒 (GNU扩展) 123456789
%3N 毫秒 (取前3位) 123
%F ISO 8601日期格式(年-月-日) 2023-07-28
%T 24小时制时间格式(时:分:秒) 14:30:00
%R 12小时制时间格式(带AM/PM) 02:30 PM

示例

date "+%Y-%m-%d"                  # 2025-08-09
date "+%H:%M:%S" # 14:30:45
date "+%A, %B %d %Y" # Saturday, August 09 2025
date "+%Y%m%d_%H%M%S" # 20250809_143045 (日志时间戳)
date -Iseconds # 2025-08-09T14:30:45+08:00

date -d "now" # 当前时间(默认)
date -d "yesterday" # 昨天此时
date -d "tomorrow" # 明天此时
date -d "next Monday" # 下周一
date -d "2 days ago" # 两天前
date -d "3 hours + 5 minutes" # 3小时5分钟后

date -d "2025-12-31 + 1 day" # 2026-01-01
date -d "Jan 1 2030 - 1000 days" # 2027-04-06

# 时间戳 → 可读时间
date -d @1754757045 # Sat Aug 9 14:30:45 CST 2025

# 可读时间 → 时间戳
date -d "2025-08-09 14:30" +%s # 1754757000

脚本日志时间戳

#!/bin/bash
log_time=$(date "+%F %T")
echo "[$log_time] 开始执行数据备份..." >> /var/log/backup.log

参数选项

选项 作用 示例
-d 解析字符串时间 date -d "next Friday"
-s 设置系统时间 date -s "2025-08-10 15:30"
-r 显示文件最后修改时间 date -r /etc/passwd
-u 显示/设置 UTC 时间 date -u
-I ISO 8601 格式输出 date -Iseconds

实验

每两个月的工作日的凌晨3点打包备份日志/var/log/secure

可以在/etc/crontab中直接编辑,也可以使用命令crontab -e 进行编辑(最好是使用crontab -e)

# 编辑用户级crontab
crontab -e
# 添加任务(每天3:00执行)
0 3 * 1,3,5,7,9,11 1-5 root tar -zcf /tmp/log.tar.gz /var/log/secure
# 注意tar打包需要相对路径,不然会将目录文件一起打包,那么这条命令就需要修改
0 3 * 1,3,5,7,9,11 1-5 root cd /var/log;tar -zcf /tmp/log.tar.gz secure
# 同样,另一个问题每次打包生成的文件名相同的话,那么每次生成新的打包文件会覆盖掉旧的文件,最好是将打包文件加上时间命名便于区分


# 最终是
[root@wickt 桌面]# crontab -e
# 输入
0 12 9 8 * root cd /var/log;tar -zcf /tmp/log`date +\%H:\%M`.tar.gz secure
# 命令解释
0 12 9 8 * # 每年8月9日12:00执行一次备份
cd /var/log # 路径为 /var/log
&& # 只有cd成功后才执行tar
/tmp/log`date +\%H:\%M`.tar.gz secure # 备份到 /tmp 目录下 文件名为 log时:分.tar.gz

image-20250809112241408

到点验证测试

* * * * * root cd /var/log;tar -zcf /tmp/log`date +\%H:\%M`.tar.gz secure

image-20250809145045281

Author: wickt42
Link: http://example.com/2025/08/07/linux计划任务/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.