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存在,只有列在其中的用户才能使用crontab(cron.deny被忽略)。 - 如果
cron.allow不存在,但cron.deny存在,则除了列在cron.deny中的用户外,其他用户都可以使用crontab。 - 如果两个文件都不存在,只有
root用户可以使用crontab(在Ubuntu等Debian系系统中,默认允许所有用户使用)。
- 这两个文件用于控制哪些用户可以使用
3. 小结
本章详细介绍了Ubuntu 22.04中两种核心的任务计划工具:at 和 crontab。
at命令 :简单直观,非常适合安排一次性 的未来任务,如延迟执行、定时提醒等。关键在于掌握其灵活的时间指定方法和任务队列管理(atq,atrm)。crontab命令 :功能强大,是实现周期性 自动化任务的标准工具。核心在于理解其五字段时间格式的语法,并学会正确地重定向输出和错误。同时,了解系统级的配置文件(/etc/crontab,/etc/cron.d/)和目录(/etc/cron.daily)有助于更好地管理整个系统的自动化任务。
合理运用at和cron,可以将系统管理员从重复、琐碎的日常工作中解放出来,极大地提高工作效率和系统的可靠性。