这种时间变动比较大,用cron不适合,且cron精度也不够
run_at.sh
#!/bin/bash # 检查是否输入了时间戳参数 if [ "$#" -ne 1 ]; then echo "Usage: $0 yyyymmddhhmmss" exit 1 fi timestamp=$1 # 解析目标时间并获取其Unix时间戳(秒)和纳秒部分 target_seconds=$(date -d "${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}" +%s) target_nanoseconds=0 # 获取当前时间的Unix时间戳(秒)和纳秒部分 current_seconds=$(date +%s) current_nanoseconds=$(date +%N) # 计算需要等待的总纳秒数 wait_seconds=$((target_seconds - current_seconds)) wait_nanoseconds=$((target_nanoseconds - current_nanoseconds)) # 如果纳秒差为负,则借位 if [ "$wait_nanoseconds" -lt 0 ]; then wait_seconds=$((wait_seconds - 1)) wait_nanoseconds=$((wait_nanoseconds + 1000000000)) fi # 汇总等待时间的秒部分和纳秒部分 wait_time=$(echo "$wait_seconds + $wait_nanoseconds / 1000000000" | bc -l) # 检查如果需要等待的时间为负数,说明输入的时间戳已过 if (( $(echo "$wait_time < 0" | bc -l) )); then echo "The input timestamp has already passed." exit 1 fi # 等待指定时间 sleep "$wait_time" # 显示当前时间,精确到毫秒 date +'%Y-%m-%d %H:%M:%S:%3N'