1.7.3 at一次性任务与批处理

at一次性任务与批处理#

1. 适用场景与工作原理(含示意图)
- 适合一次性、延迟执行任务,如夜间维护、临时数据修复、单次清理。
- 由 at 提交任务到队列,atd 守护进程按时间触发执行。

文章图片

2. 安装与服务启用(含命令说明)
- Debian/Ubuntu 安装并启动:

sudo apt update
sudo apt install -y at
sudo systemctl enable --now atd
systemctl status atd
  • RHEL/CentOS 安装并启动:
sudo yum install -y at
sudo systemctl enable --now atd
systemctl status atd
  • 命令解释:
  • systemctl enable --now atd:设置开机自启并立即启动。
  • systemctl status atd:确认服务是否运行。

3. 基本命令与完整示例(含可执行脚本)
- 交互式提交任务(23:30执行):

at 23:30
# 输入命令
/usr/bin/df -h > /var/log/df_once.log
# 按 Ctrl+D 结束提交
  • 直接提交脚本文件(建议使用绝对路径):
cat >/opt/scripts/cleanup_tmp.sh <<'EOF'
#!/bin/bash
set -e
echo "cleanup start: $(date)" >> /var/log/cleanup_tmp.log
find /tmp -type f -mtime +7 -delete
echo "cleanup end: $(date)" >> /var/log/cleanup_tmp.log
EOF
chmod +x /opt/scripts/cleanup_tmp.sh

at -f /opt/scripts/cleanup_tmp.sh now + 1 hour
  • 查看与管理任务:
atq        # 查看任务队列
at -l      # 同 atq
at -c 5    # 查看 jobid=5 的实际执行内容与环境
atrm 5     # 删除任务

4. 时间表达与批处理示例(含队列优先级)
- 时间表达示例:

echo "date >> /var/log/at_time.log" | at 2024-12-01 01:00
echo "date >> /var/log/at_time.log" | at now + 30 minutes
echo "date >> /var/log/at_time.log" | at midnight
  • 批量提交(每小时执行一次脚本):
for h in 1 2 3; do
  echo "/opt/scripts/cleanup_tmp.sh" | at now + $h hours
done
  • 指定队列优先级(a 优先级高):
echo "/opt/scripts/cleanup_tmp.sh" | at -q a now + 10 minutes

5. 权限控制与安全设置(含配置示例)
- 仅允许特定用户:

echo "opsuser" | sudo tee /etc/at.allow
sudo rm -f /etc/at.deny
  • 拒绝某些用户:
echo "testuser" | sudo tee /etc/at.deny
  • 说明:若两者都不存在,通常默认允许所有用户(依发行版而定)。

6. 输出、日志与环境变量注意事项
- 默认输出会发送到本地邮件(如未配置邮件会丢失或不可见)。
- 推荐显式重定向日志:

echo "/opt/scripts/cleanup_tmp.sh >> /var/log/cleanup_tmp.log 2>&1" | at 02:10
  • at 环境精简,建议脚本内显式设置 PATH:
cat >/opt/scripts/env_test.sh <<'EOF'
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/usr/bin/env > /var/log/at_env.log
EOF
chmod +x /opt/scripts/env_test.sh
echo "/opt/scripts/env_test.sh" | at now + 1 minute

7. 常见问题排查(含命令与预期)
- 任务未执行:

systemctl status atd
atq   # 任务是否仍在队列
date  # 系统时间是否正确
  • 权限被拒:
cat /etc/at.allow
cat /etc/at.deny
  • 脚本不执行:
ls -l /opt/scripts/cleanup_tmp.sh   # 是否有执行权限
at -c <jobid>                       # 查看实际执行内容与环境

8. 练习题(含目标与验证方式)
1) 练习1: 创建任务在 5 分钟后输出磁盘占用到日志
- 命令:

echo "/usr/bin/df -h > /var/log/df_once.log" | at now + 5 minutes
  • 验证:
cat /var/log/df_once.log

2) 练习2: 批量提交 3 个任务,每隔 10 分钟写入时间
- 命令:

for i in 1 2 3; do
  echo "date >> /var/log/at_batch.log" | at now + $((i*10)) minutes
done
  • 验证:
cat /var/log/at_batch.log

9. 最佳实践
- 将复杂逻辑封装为脚本,at 仅负责调度。
- 统一日志输出位置,便于审计与排错。
- 关键任务使用高优先级队列并限制可用用户。
- 提交后用 at -c <jobid> 核对执行环境与命令。