温馨提示×

ubuntu定时下载文件方法

小樊
48
2025-11-16 15:33:12
栏目: 智能运维

Ubuntu 定时下载文件的实用方法

一、方法总览与选择

  • cron + wget/curl:系统自带、最通用,适合大多数 HTTP/HTTPS/FTP 下载场景,支持分钟级到月级的调度。
  • systemd Timer + 服务:更适合需要依赖管理、日志统一、开机自启与精细控制的场景。
  • 一次性任务 at:只执行一次的下载,适合临时安排。
  • FTP 批量定时:传统 FTP 环境下可用脚本配合 cron 批量拉取按日期命名的文件。

二、方法一 Cron + wget 或 curl(推荐)

    1. 准备下载脚本(可选,便于复杂逻辑与日志管理)
    • 示例脚本:/home/ubuntu/dl.sh
      #!/usr/bin/env bash
      set -Eeuo pipefail
      url="https://example.com/data.csv"
      out="/data/$(date +%F_%H-%M-%S).csv"
      wget -q --show-progress --timeout=30 --tries=3 \
           -O "$out" "$url" && \
        echo "$(date) success: $out" >> /var/log/dl.log || \
        echo "$(date) fail: $url" >> /var/log/dl.err
      
    • 赋权:chmod +x /home/ubuntu/dl.sh
    1. 编辑定时任务
    • 命令:crontab -e
    • 常用时间格式:分 时 日 月 周;如每天 04:00 执行:0 4 * * *
    1. 典型 cron 示例
    • 每天 04:00 下载到固定文件:
      0 4 * * * wget -O /data/data.csv https://example.com/data.csv
    • 每 5 分钟下载并用日期命名:
      */5 * * * * wget -O “/data/$(date +%F_%H-%M-%S).csv” https://example.com/data.csv
    • 每天 03:00 执行自定义脚本并写日志:
      0 3 * * * /home/ubuntu/dl.sh >> /var/log/dl.log 2>&1
    1. 实用 wget 参数
    • -O 指定保存文件名;-c 断点续传;–limit-rate=300k 限速;-b 后台下载;–spider 仅检测链接有效性;–user-agent=… 伪装 UA;-q 静默(配合日志更清晰)。

三、方法二 systemd Timer(替代方案)

    1. 创建服务单元:/etc/systemd/system/dl.service
    [Unit]
    Description=定时下载服务
    After=network.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/wget -O /data/latest.zip https://example.com/file.zip
    User=ubuntu
    Group=ubuntu
    
    1. 创建定时器:/etc/systemd/system/dl.timer
    [Unit]
    Description=每小时执行一次下载
    Requires=dl.service
    
    [Timer]
    OnBootSec=1min
    OnUnitActiveSec=1h
    Unit=dl.service
    
    [Install]
    WantedBy=timers.target
    
    1. 启用与启动
    • sudo systemctl daemon-reload
    • sudo systemctl enable --now dl.timer
    • 查看状态:systemctl status dl.timer;列出定时器:systemctl list-timers

四、方法三 FTP 批量按日期下载(传统环境)

  • 示例脚本(每天 06:00 拉取昨天的小时与天粒度文件):/home/ubuntu/get_ftp.sh
    #!/usr/bin/env bash
    set -Eeuo pipefail
    ftp -n <<EOF
    open 10.19.15.23
    user your_ftp_user your_ftp_pass
    binary
    cd /hour
    lcd /data/hour
    hash
    prompt off
    mget *$(date -d yesterday +%Y%m%d)*
    cd ../day
    mget *$(date -d yesterday +%Y%m%d)*
    close
    bye
    EOF
    echo "$(date) ftp done" >> /var/log/ftp_dl.log
    
  • 加入定时:0 6 * * * /home/ubuntu/get_ftp.sh

五、排错与最佳实践

  • 使用绝对路径:在 cron 中建议写全 /usr/bin/wget 或 /usr/bin/curl,避免 PATH 不一致。
  • 环境变量与目录:cron 环境较精简,必要时在脚本内显式设置 PATHHOME,并在目标目录提前创建(如 mkdir -p /data)。
  • 日志与错误输出:将 stdout/stderr 重定向到日志文件,便于审计与告警(>> /var/log/dl.log 2>&1)。
  • 幂等与断点续传:大文件或易中断链路建议加 -c;按时间/版本命名避免覆盖。
  • 链接健康检查:上线前用 wget --spider URL 验证可达性与返回码。
  • 时区与夏令时:确保系统时区设置正确(timedatectl),避免错峰执行。
  • 一次性任务:临时在 22:30 执行可用:echo “wget URL -O /data/file” | at 22:30。

0