Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的任务计划详解(16)

Ubuntu 22.04中的任务计划详解

任务计划(或称为作业调度)是系统管理中不可或缺的一部分,它允许我们在指定的时间或周期性地自动执行命令或脚本,从而实现自动化运维。Ubuntu 22.04主要提供了两种任务计划工具:at(用于执行一次性任务)和cron(用于执行周期性任务)。

1. 简单的定时 at 命令

at 命令用于安排一个任务在未来的某个特定时间点执行一次。执行完毕后,该任务便会从队列中消失。

1.1 at 命令的使用

知识点:

在使用 at 之前,需要确保 atd 服务(at daemon)正在运行。该服务负责读取并执行 at 队列中的任务。
安装部署与详细步骤:
步骤 1: 安装并启动 atd 服务
at 命令通常默认已安装,但 atd 服务可能未启动。

bash 复制代码
# 安装 at 软件包(如果未安装)
$ sudo apt update
$ sudo apt install at
# 启动 atd 服务
$ sudo systemctl start atd
# 设置 atd 服务开机自启
$ sudo systemctl enable atd
# 检查 atd 服务状态
$ sudo systemctl status atd
# 应该看到 "active (running)" 的字样

步骤 2: at 命令的语法与使用方法
语法知识点:
at 的时间指定方式非常灵活:

  • 绝对时间 : HH:MM (如 17:00), MMDDYY, MM/DD/YY, DD.MM.YY
  • 相对时间 : now + <时间单位> (如 now + 5 minutes, tomorrow, next week)
  • 特殊时间 : midnight (午夜), noon (中午), teatime (下午4点)
    案例代码:
    案例 1: 交互式添加任务
bash 复制代码
# 在今天下午5点整,发送一个提醒
$ at 17:00
# warning: commands will be executed using /bin/sh
# at> echo "该去开会了!" | mail -s "会议提醒" your_email@example.com
# at> <EOT>  # 按下 Ctrl+D 结束输入
# job 3 at Tue May 21 17:00:00 2024
# "job 3" 是任务编号

案例 2: 通过管道添加任务

bash 复制代码
# 在1分钟后,创建一个包含当前日期和时间的文件
$ echo "date > /tmp/current_time.txt" | at now + 1 minute
# 在明天午夜,执行一个备份脚本
$ echo "/home/user/scripts/backup.sh" | at midnight

案例 3: 从文件读取任务

如果任务很复杂,可以将其写入脚本文件,然后让 at 执行该脚本。

bash 复制代码
# 创建一个任务脚本
$ nano my_at_task.sh
# --- 文件内容 ---
# #!/bin/bash
# tar -czf /backups/home_$(date +\%F).tar.gz /home
# echo "备份完成: /backups/home_$(date +\%F).tar.gz" | mail -s "备份成功" your_email@example.com
# --- 文件结束 ---
# 让at在明天凌晨3点执行这个脚本
$ at -f my_at_task.sh 03:00 tomorrow
# -f 选项后跟脚本文件名

步骤 3: 管理 at 任务

bash 复制代码
# 查看待执行的 at 任务队列
$ atq
# 或 at -l
# 输出示例:
# 3	Tue May 21 17:00:00 2024 a user
# 4	Wed May 22 03:00:00 2024 a user
# 格式: [任务号] [执行时间] [队列] [用户]
# 删除一个待执行的任务 (使用任务号)
$ atrm 3
# 或 at -d 3
# 再次查看,任务3已被删除
$ atq
# 4	Wed May 22 03:00:00 2024 a user
1.2 定时备份系统文件

这是一个 at 命令的典型应用场景。
安装部署与详细步骤:
步骤 1: 创建备份脚本

bash 复制代码
# 创建一个目录存放脚本
$ mkdir -p ~/scripts
$ nano ~/scripts/system_backup.sh

案例代码 (~/scripts/system_backup.sh):

bash 复制代码
#!/bin/bash
# 定义备份目录和源目录
BACKUP_DIR="/var/backups/manual"
SOURCE_DIR="/etc"
DATE=$(date +%F_%H-%M-%S)
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
# 执行备份,使用tar打包并压缩
# -c: 创建, -z: gzip压缩, -f: 指定文件名, -p: 保留权限
tar -czpf "$BACKUP_DIR/etc_backup_$DATE.tar.gz" "$SOURCE_DIR"
# 检查上一条命令是否成功
if [ $? -eq 0 ]; then
    echo "系统配置文件备份成功: $BACKUP_DIR/etc_backup_$DATE.tar.gz"
else
    echo "备份失败!" >&2 # 将错误信息输出到标准错误
fi

步骤 2: 给脚本添加执行权限

bash 复制代码
$ chmod +x ~/scripts/system_backup.sh

步骤 3: 使用 at 安排备份任务

bash 复制代码
# 安排在今晚11点执行备份
$ at -f ~/scripts/system_backup.sh 23:00

2. 控制计划任务的命令 crontab

cron 是一个用于执行周期性任务的守护进程。crontab 命令则是用来管理每个用户的 cron 任务列表(即 crontab 文件)的工具。

2.1 crontab 的原理

知识点:

  • cron 守护进程 (crond) 在系统启动时自动运行,每分钟都会检查一次 /etc/crontab 文件以及 /var/spool/cron/crontabs/ 目录下的文件。
  • /var/spool/cron/crontabs/ 目录中,每个用户都有一个以自己用户名命名的文件,该文件记录了该用户的所有 cron 任务。
  • crontab 命令就是用来编辑这些文件的,避免了直接修改带来的语法错误风险。
2.2 crontab 的使用

语法知识点:
crontab 命令的常用选项:

  • crontab -e: 编辑当前用户的 crontab 文件。首次使用会提示选择编辑器(如 nano)。

  • crontab -l: 列出当前用户的所有 cron 任务。

  • crontab -r: 删除当前用户的所有 cron 任务(慎用!)。

  • crontab -u <用户名> -e: 以 root 身份编辑指定用户的 crontab 文件。
    cron 任务的时间格式(核心知识点):
    一个 cron 任务行由6个字段组成,前5个是时间字段,最后一个是命令。

    .---------------- 分钟 (0 - 59)
    | .------------- 小时 (0 - 23)
    | | .---------- 日 (1 - 31)
    | | | .------- 月 (1 - 12)
    | | | | .---- 星期 (0 - 6) (星期0=星期天)
    | | | | |

            • 要执行的命令

特殊字符:

  • *: 任意值。例如,在分钟字段使用 * 表示每分钟。
  • ,: 分隔多个值。例如,1,3,5 在小时字段表示第1、3、5小时。
  • -: 表示范围。例如,1-5 在星期字段表示星期一到星期五。
  • /: 表示步长。例如,*/10 在分钟字段表示每10分钟。
    案例代码:
    案例 1: 编辑和管理 crontab
bash 复制代码
# 编辑当前用户的cron任务
$ crontab -e
# 当第一次运行时,可能会出现以下提示:
# no crontab for user - using an empty one
# Select an editor.  To change later, run 'select-editor'.
#   1. /bin/nano        <---- easiest
#   2. /usr/bin/vim.basic
#   3. /usr/bin/vim.tiny
#   4. /bin/ed
# Choose 1-4 [1]: 1  # 选择1(nano)
# 列出当前用户的cron任务
$ crontab -l
# 删除当前用户的所有cron任务 (会要求确认)
$ crontab -r

案例 2: 添加具体的周期性任务

crontab -e 打开的编辑器中,添加以下行:

bash 复制代码
# 每15分钟同步一次时间
*/15 * * * * /usr/sbin/ntpdate -s time.nist.gov
# 每天凌晨2点30分,执行备份脚本
30 2 * * * /home/user/scripts/system_backup.sh >> /var/log/my_backup.log 2>&1
# 每周一上午9点,发送一封周报邮件
0 9 * * 1 mail -s "周报" manager@example.com < /home/user/weekly_report.txt
# 每月的1号和15号,清空/tmp目录下的临时文件 (谨慎使用)
0 0 1,15 * * find /tmp -type f -atime +7 -delete
# 每小时的第5分钟,检查磁盘空间
5 * * * * df -h | mail -s "磁盘空间报告" admin@example.com

注释:

  • >> /var/log/my_backup.log 2>&1: 这是一个非常重要的重定向。
    • >>: 将标准输出追加到日志文件。
    • 2>&1: 将标准错误也重定向到标准输出,这样错误信息也会被写入日志文件。
  • mail -s "主题" 收件人 < 文件: 将文件内容作为邮件正文发送。
2.3 任务配置文件介绍

除了用户自己的 crontab 文件,还有系统级的 cron 配置文件。
知识点:

  • /etc/crontab: 系统主 cron 配置文件。它和用户 crontab 文件格式略有不同,多了一个"用户"字段。

    复制代码
    # /etc/crontab: system-wide crontab
    # ... (注释)
    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    # ... (其他环境变量)
    #
    # m h dom mon dow user  command
    17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
    25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    • run-parts: 一个命令,它会执行指定目录下的所有可执行脚本。
    • 这意味着,你可以把需要每天、每周、每月执行的脚本分别放到 /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 目录下,系统会自动执行。
  • /etc/cron.d/: 这个目录用于存放系统级的 cron 任务文件。你可以在这里创建一个新的配置文件,格式和 /etc/crontab 一样,需要指定用户。这比直接修改 /etc/crontab 更规范。

  • /etc/cron.allow/etc/cron.deny:

    • 这两个文件用于控制哪些用户可以使用 crontab 命令。
    • 如果 cron.allow 存在,只有列在其中的用户才能使用 crontabcron.deny 被忽略)。
    • 如果 cron.allow 不存在,但 cron.deny 存在,则除了列在 cron.deny 中的用户外,其他用户都可以使用 crontab
    • 如果两个文件都不存在,只有 root 用户可以使用 crontab(在Ubuntu等Debian系系统中,默认允许所有用户使用)。

3. 小结

本章详细介绍了Ubuntu 22.04中两种核心的任务计划工具:atcrontab

  • at 命令 :简单直观,非常适合安排一次性 的未来任务,如延迟执行、定时提醒等。关键在于掌握其灵活的时间指定方法和任务队列管理(atq, atrm)。
  • crontab 命令 :功能强大,是实现周期性 自动化任务的标准工具。核心在于理解其五字段时间格式的语法,并学会正确地重定向输出和错误。同时,了解系统级的配置文件(/etc/crontab, /etc/cron.d/)和目录(/etc/cron.daily)有助于更好地管理整个系统的自动化任务。
    合理运用 atcron,可以将系统管理员从重复、琐碎的日常工作中解放出来,极大地提高工作效率和系统的可靠性。
相关推荐
oMcLin2 小时前
CentOS 7.9 使用 SELinux 时无法访问特定目录:如何配置 SELinux 策略允许访问
linux·运维·centos
我命由我123452 小时前
Photoshop - Photoshop 工具栏(53)画板工具
笔记·学习·职场和发展·求职招聘·职场发展·学习方法·photoshop
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之whereis命令(实操篇)
linux·运维·服务器·网络·笔记
oMcLin2 小时前
CentOS 7.9 上运行 Docker 容器内存溢出问题:如何优化容器资源限制与监控配置
linux·docker·centos
徐sir(徐慧阳)2 小时前
WebLogic 更换服务器后java segmentation fault错误解决记录
linux·服务器·中间件·jdk
小马爱打代码2 小时前
Spring Boot Actuator 学习笔记
spring boot·笔记·学习
名誉寒冰2 小时前
AI云存储学习笔记:小文件优化 / 大文件分片 / 分享与 AI 搜索
linux·人工智能·笔记·学习
kubernetes-k8s2 小时前
计划开始学习:OpenStack从入门到精通
linux·运维·服务器
oMcLin2 小时前
Ubuntu 22.04 系统通过 SSH 远程登录失败:如何解决 SSH 配置文件错误导致的登录问题
数据库·ubuntu·ssh