at -d 命令完全相同。
atrm(at remove)命令用于删除由 at 或 batch 命令安排的待执行任务。当不再需要执行某个已安排的定时任务时,可以使用 atrm 命令将其从队列中删除。atrm 是 at 命令家族中的重要成员,与 atq、at 等命令配合使用,提供了完整的定时任务管理功能。
atrm 命令随 at 软件包一起安装。在大多数 Linux 发行版中,at 命令需要单独安装:
sudo apt-get install at
sudo yum install at
# CentOS 8+使用dnf
sudo dnf install at
sudo dnf install at
sudo pacman -S at
# 启动atd服务
sudo systemctl start atd
# 设置开机自启
sudo systemctl enable atd
# 检查服务状态
sudo systemctl status atd
which atrm
atrm [选项] 任务编号 [任务编号...]
| 选项 | 说明 |
|---|---|
-v 或 --version |
显示版本信息 |
-h 或 --help |
显示帮助信息 |
-V |
显示版本信息 |
# 首先查看当前任务列表
atq
# 输出:15 2024-12-25 14:30 a username
# 删除任务编号为15的任务
atrm 15
# 验证任务已删除
atq
# 删除任务编号为15、16、17的任务
atrm 15 16 17
# 也可以使用范围(但需要外部工具辅助)
atrm 15 16 17 18 19
# at -d 与 atrm 功能完全相同
at -d 15
# 或者使用--delete选项
at --delete=15
# 删除多个任务
at -d 15 16 17
# 删除当前用户的所有任务
atq | awk '{print $1}' | xargs atrm
# 或者使用循环
for job in $(atq | awk '{print $1}'); do
atrm $job
done
# 删除所有用户的所有任务(需要root权限)
sudo atq | awk '{print $1}' | xargs sudo atrm
# 删除队列a的所有任务
atq -q a | awk '{print $1}' | xargs atrm
# 删除队列b的所有任务
atq -q b | awk '{print $1}' | xargs atrm
# 删除特定队列的指定用户任务
atq -q a | grep "username" | awk '{print $1}' | xargs atrm
# 删除今天的所有任务
TODAY=$(date +"%Y-%m-%d")
atq | grep "$TODAY" | awk '{print $1}' | xargs atrm
# 删除特定时间的任务
atq | grep "2024-12-25 14:30" | awk '{print $1}' | xargs atrm
# 删除过去时间(已过期)的任务
atq | while read line; do
job_time=$(echo "$line" | awk '{print $2" "$3}')
job_timestamp=$(date -d "$job_time" +%s 2>/dev/null)
now_timestamp=$(date +%s)
if [ -n "$job_timestamp" ] && [ "$job_timestamp" -lt "$now_timestamp" ]; then
job_id=$(echo "$line" | awk '{print $1}')
atrm "$job_id"
fi
done
#!/bin/bash
# 交互式删除任务
echo "当前任务列表:"
atq
read -p "请输入要删除的任务编号(多个编号用空格分隔): " job_ids
if [ -n "$job_ids" ]; then
echo "正在删除任务:$job_ids"
atrm $job_ids
if [ $? -eq 0 ]; then
echo "任务删除成功"
else
echo "任务删除失败"
fi
echo "剩余任务:"
atq
else
echo "未输入任务编号"
fi
# 查看正在运行的任务(队列为=)
atq | grep " = "
# 获取运行中任务的编号
RUNNING_JOBS=$(atq | grep " = " | awk '{print $1}')
# 删除运行中的任务(需要谨慎)
if [ -n "$RUNNING_JOBS" ]; then
echo "警告:正在删除运行中的任务"
atrm $RUNNING_JOBS
fi
atrm 是 at 命令家族的重要成员,与其他命令紧密相关:
# 以下三个命令功能完全相同
atrm 15
at -d 15
at --delete=15
| 命令 | 功能 | 与atrm的关系 |
|---|---|---|
at |
创建定时任务 | 创建的任务可用atrm删除 |
atq |
查看任务队列 | 提供任务编号用于atrm删除 |
atrm |
删除任务 | 核心删除命令 |
batch |
创建批处理任务 | 创建的任务可用atrm删除 |
at -c |
查看任务内容 | 查看要删除的任务内容 |
# 1. 查看当前任务
atq
# 输出: 15 2024-12-25 14:30 a username
# 2. 查看任务详情(可选)
at -c 15
# 3. 删除任务
atrm 15
# 4. 验证删除结果
atq
# 5. 批量操作示例
echo "创建3个测试任务"
for i in {1..3}; do
echo "echo '任务$i'" | at now + $((i+1)) minutes
done
# 查看所有任务
atq
# 删除所有任务
atq | awk '{print $1}' | xargs atrm
#!/bin/bash
# 安全删除at任务脚本
BACKUP_DIR="/var/backup/at_tasks"
LOG_FILE="/var/log/atrm_audit.log"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
echo "$(date): 开始删除任务" >> "$LOG_FILE"
# 备份要删除的任务
atq | while read line; do
job_id=$(echo "$line" | awk '{print $1}')
job_info="$line"
# 备份任务内容
at -c "$job_id" > "$BACKUP_DIR/task_${job_id}_$(date +%Y%m%d_%H%M%S).txt"
echo "备份任务 $job_id: $job_info" >> "$LOG_FILE"
# 删除任务
atrm "$job_id"
if [ $? -eq 0 ]; then
echo " 删除成功" >> "$LOG_FILE"
else
echo " 删除失败" >> "$LOG_FILE"
fi
done
echo "$(date): 任务删除完成" >> "$LOG_FILE"
echo "备份已保存到: $BACKUP_DIR"
#!/bin/bash
# 根据条件删除at任务
CONDITION="backup" # 删除包含特定关键词的任务
echo "查找包含 '$CONDITION' 的任务..."
atq | while read line; do
job_id=$(echo "$line" | awk '{print $1}')
# 检查任务内容是否包含关键词
if at -c "$job_id" | grep -qi "$CONDITION"; then
echo "删除任务 $job_id (包含 '$CONDITION')"
atrm "$job_id"
fi
done
#!/bin/bash
# 定期清理at任务
MAX_DAYS=7 # 保留最近7天的任务
LOG_FILE="/var/log/at_cleanup.log"
echo "$(date): 开始清理at任务" >> "$LOG_FILE"
atq | while read line; do
job_id=$(echo "$line" | awk '{print $1}')
job_time=$(echo "$line" | awk '{print $2" "$3}')
# 计算任务时间与当前时间的差异
job_timestamp=$(date -d "$job_time" +%s 2>/dev/null)
now_timestamp=$(date +%s)
if [ -n "$job_timestamp" ]; then
days_diff=$(((now_timestamp - job_timestamp) / 86400))
if [ "$days_diff" -gt "$MAX_DAYS" ]; then
echo "删除任务 $job_id (创建于 $job_time, 已超过 $MAX_DAYS 天)" >> "$LOG_FILE"
atrm "$job_id"
fi
fi
done
echo "$(date): 清理完成" >> "$LOG_FILE"
#!/bin/bash
# 管理特定用户的任务
TARGET_USER="$1"
ACTION="$2" # list, delete, backup
if [ -z "$TARGET_USER" ]; then
echo "用法: $0 用户名 [list|delete|backup]"
exit 1
fi
case "$ACTION" in
list)
echo "$TARGET_USER 的任务列表:"
sudo atq | grep " $TARGET_USER$"
;;
delete)
echo "删除 $TARGET_USER 的所有任务..."
sudo atq | grep " $TARGET_USER$" | awk '{print $1}' | xargs sudo atrm
echo "删除完成"
;;
backup)
BACKUP_DIR="/tmp/at_backup_${TARGET_USER}_$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
echo "备份 $TARGET_USER 的任务到 $BACKUP_DIR"
sudo atq | grep " $TARGET_USER$" | while read line; do
job_id=$(echo "$line" | awk '{print $1}')
sudo at -c "$job_id" > "$BACKUP_DIR/task_${job_id}.txt"
echo " 备份任务 $job_id"
done
;;
*)
echo "未知操作: $ACTION"
echo "可用操作: list, delete, backup"
;;
esac
#!/bin/bash
# 批量删除任务前确认
TASK_COUNT=$(atq | wc -l)
if [ "$TASK_COUNT" -eq 0 ]; then
echo "没有任务需要删除"
exit 0
fi
echo "当前有 $TASK_COUNT 个任务:"
atq
read -p "是否要删除所有任务?(y/N): " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
echo "正在删除所有任务..."
atq | awk '{print $1}' | xargs atrm
# 验证删除结果
REMAINING=$(atq | wc -l)
if [ "$REMAINING" -eq 0 ]; then
echo "所有任务已成功删除"
else
echo "删除完成,剩余 $REMAINING 个任务"
fi
else
echo "取消删除"
fi
#!/bin/bash
# 记录所有atrm操作的详细日志
AUDIT_LOG="/var/log/atrm_audit.log"
# 记录操作
log_action() {
local user="$1"
local action="$2"
local job_id="$3"
local job_info="$4"
echo "$(date) | 用户: $user | 操作: $action | 任务ID: $job_id | 任务信息: $job_info" >> "$AUDIT_LOG"
}
# 包装atrm命令
safe_atrm() {
local job_ids="$@"
for job_id in $job_ids; do
# 获取任务信息
job_info=$(atq | grep "^$job_id ")
if [ -n "$job_info" ]; then
# 记录删除前信息
log_action "$(whoami)" "DELETE" "$job_id" "$job_info"
# 执行删除
atrm "$job_id"
# 验证删除
if ! atq | grep -q "^$job_id "; then
echo "任务 $job_id 删除成功"
else
echo "任务 $job_id 删除失败" >> "$AUDIT_LOG"
fi
else
echo "任务 $job_id 不存在"
fi
done
}
# 使用包装后的命令
safe_atrm 15 16 17
A: 可能的原因:
# 检查任务是否存在
atq | grep "^15 "
# 检查权限
whoami
sudo atq | grep "^15 "
# 检查atd服务状态
sudo systemctl status atd
# 尝试使用sudo删除
sudo atrm 15
A: 需要root权限:
# 查看所有用户的任务
sudo atq
# 删除特定任务
sudo atrm 15
# 删除特定用户的所有任务
sudo atq | grep " username$" | awk '{print $1}' | xargs sudo atrm
# 删除所有任务
sudo atq | awk '{print $1}' | xargs sudo atrm
A: 两者功能完全相同,atrm 是 at -d 的别名:
# 两个命令的功能相同
atrm 15
at -d 15
# 检查是否指向同一个程序
which atrm
which at
# 实际上atrm通常是一个符号链接
ls -l $(which atrm)
在大多数系统中,atrm 是 at 命令的符号链接。
A: atrm 命令默认不进行确认,直接删除任务。如果需要确认机制,可以:
# 创建带确认的删除函数
confirm_atrm() {
local job_id="$1"
# 显示任务信息
echo "任务信息:"
atq | grep "^$job_id "
read -p "确认删除任务 $job_id 吗?(y/N): " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
atrm "$job_id"
echo "任务已删除"
else
echo "取消删除"
fi
}
# 使用示例
confirm_atrm 15
A: atrm 删除任务后无法直接恢复,但可以采取预防措施:
at -c 任务号 > 备份文件.txt# 备份任务内容
at -c 15 > task_15_backup.txt
# 从备份重新创建任务
cat task_15_backup.txt | grep -A100 "cd " | tail -n +2 | at 原时间
at -c 任务号