Linux命令 – 用wget进行并行下载
1.概述
在本教程中,我们将使用一个简单的工具wget来并行下载多个文件。
本文中使用的命令是在bash中测试的,但在其他符合POSIX标准的shell中也应该可以工作。
2.用wget下载文件
用wget下载文件是相当直截了当的。
wget https://my.website.com/archive.zip
遗憾的是,我们一次只能下载一个文件。
我们不得不求助于shell脚本,以便在一个命令中下载多个文件。
#!/bin/bash
while read file; do
wget ${file}
done < files.txt
在这里,files.txt包含所有必须下载的文件,每个文件都在自己的行中。
https://my.website.com/archive-1.zip
https://my.website.com/archive-2.zip
https://my.website.com/archive-3.zip
然而,这种方法的问题是,文件是按顺序下载的。我们可能会通过并行下载文件来加速事情的进展。
3.用wget进行并行下载
我们可以通过不同的方式让wget并行下载文件。
3.1.Bash方法
一个简单而又有点天真的方法是使用&-操作符将wget进程发送到后台。
#!/bin/bash
while read file; do
wget ${file} &
done < files.txt
对wget的每次调用都会被分叉到后台,并在自己独立的子shell中异步运行。
虽然我们现在是并行下载文件,但这种方法也不是没有缺点的。例如,对完成或失败的下载没有反馈。另外,我们无法控制一次执行多少个进程。
3.2.让wget 叉开它自己
我们可以做得更好一些,通过传递-b作为参数,让wget将自己分叉到后台。
#!/bin/bash
while read file; do
wget ${file} -b
done < files.txt
就像&-operator一样,每个调用都被分叉到后台并异步运行。但不同的是,-b参数还为我们为每次下载制作了一个日志文件。我们可以grep这些日志文件来检查是否有错误发生。
3.3.使用xargs。
解决我们问题的最复杂、最干净的方法是使用xargs。xargs命令接受一个参数列表,并将这些参数传递给一个选择的实用程序,有可能并行运行多个进程。
最重要的是,它使我们能够控制在任何给定时间内同时运行的最大数量的进程。
例如,我们可以为files.txt中的每一行调用wget,最多可以有两个进程并行。
#!/bin/bash
cat files.txt | xargs -n 1 -P 2 wget -q
我们还将wget设置为安静(-q)。如果不这样做,xargs会把所有进程的输出重定向到stdout,这将使我们的终端瞬间变得杂乱。相反,我们可以依靠xargs‘的返回代码。如果没有发生错误,它将以0的值退出,否则以1的值退出。
4.总结
正如我们所看到的,有不同的方式,我们可以使用wget下载多个文件,并行下载。
xargs命令也为这个问题提供了最简洁的解决方案;它在脚本中相当有用,因为它提供了适量的控制,并有一个简洁的退出代码。