【问题标题】:Shell download script外壳下载脚本
【发布时间】:2017-03-01 20:53:34
【问题描述】:

我应该编写一个 sh 脚本,它下载一个文件(大约 100MB - 100GB)并在 mysql 数据库中每 10 秒写入一次进度(百分比、下载速度、剩余时间)。 有人可以帮我吗?

谢谢!

祝你有美好的一天:)

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。我们不是代码编写服务。如果您向我们展示您的尝试,我们更愿意,我们会看看我们是否可以帮助您。那么,你尝试过什么?为什么它必须进入 MySQL?似乎有点矫枉过正。
  • 对不起。我已经尝试过 Wget,它会下载我的文件,但现在我怎样才能获得状态? mysql不是必须的。记录到文件也可以。

标签: mysql shell file download wget


【解决方案1】:

wget 具有--progress 选项,但它适用于正在观察进度的人。 curl 也有一个进度表,但同样,它是为人类设计的。

您可以使用wget -o 将进度信息发送到日志文件,然后对其进行解析。

--2017-03-01 13:13:21--  http://download.thinkbroadband.com/1GB.zip
Resolving download.thinkbroadband.com (download.thinkbroadband.com)... 80.249.99.148
Connecting to download.thinkbroadband.com (download.thinkbroadband.com)|80.249.99.148|:80... connect
HTTP request sent, awaiting response... 200 OK
Length: 1073741824 (1.0G) [application/zip]
Saving to: ‘1GB.zip’

     0K .......... .......... .......... .......... ..........  0%  150K 1h56m
    50K .......... .......... .......... .......... ..........  0%  308K 86m34s
   100K .......... .......... .......... .......... ..........  0% 2.31M 60m10s
   150K .......... .......... .......... .......... ..........  0%  348K 57m41s
   200K .......... .......... .......... .......... ..........  0% 3.34M 47m10s

你必须编写一个程序来解析它。

使用提供进度回调的 HTTP 客户端库编写小程序更简单、更灵活。下面是一个使用 HTTP::Tiny 的 Perl 示例。

#!/usr/bin/perl

use strict;
use warnings;
use v5.10;
use HTTP::Tiny;

my $url = "http://download.thinkbroadband.com/100MB.zip";

# A tiny HTTP client.
my $http = HTTP::Tiny->new;

# Track how many bytes have been received.
my $completed = 0;
$http->request("GET", $url, {
    # Add a callback when the next data hunk is received.
    data_callback => sub {
        # The data hunk, and info about the request.
        my($chunk, $response) = @_;

        # Add to the total received.
        $completed += length $chunk;

        # Get the total length (this won't always be available)
        my $length = $response->{'headers'}{'content-length'} || '?';

        # Calculate the percent received.
        my $percent = $completed / $length * 100;

        # Print it, making sure not to print too many decimal places.
        printf "%d of %d - %.2f%%\n", $completed, $length, $percent;

        return;
    }
});

大多数语言都有类似的东西。现在您可以随心所欲地记录进度。

【讨论】:

  • 哇,非常感谢您的出色回答!我想我会使用第二种方法。现在我的最后一个问题是我可以从 php 启动 perl 脚本吗?
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多