写了一个脚本,目的是3个线程同时下载文件,代码如下
-------------------------------------------------------------------------------------------
#!/bin/bash
mkfifo fifo && exec 7<>fifo && rm fifo
for n in {1..3}
do
echo >&7
done
for i in {1..39}
do
{
read -u7
for j in {1..5}
do
echo $i file $j time
mkdir $$
./you-get/you-get `sed -n "$i"p urls` -o $$
if [ $? == 0 ]
then
break
mv $$/*mp4 .
rmdir $$
fi
echo >&7
done
}&
done
-------------------------------------------------------------------------------------------
其中,$i是要下载文件的数目,$j是重试次数,$n是线程数,
也就是说,
39个文件,5次重试,同时下载3个。
然而,实际的执行效果,是三个文件都下载到同一个目录里面,让他开启三个子进程,不要让他下到同一个目录里面。
谁会做,帮我看看。
高手帮我看看这个并行下载脚本哪里有毛病
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: 高手帮我看看这个并行下载脚本哪里有毛病
遇事不懂查手册 man bash
这就是$$的行为
至于该怎么处理,你在手册里搜$$就会知道
代码: 全选
$ Expands to the process ID of the shell. In a () subshell, it
expands to the process ID of the current shell, not the sub‐
shell.
至于该怎么处理,你在手册里搜$$就会知道
-
- 帖子: 1
- 注册时间: 2019-08-16 0:23
- 系统: macos
Re: 高手帮我看看这个并行下载脚本哪里有毛病
修改了一下,或许就好了,如果还有问题,仔细查看you-get那个地方,以及mv $$/*mp4 .这个地方。
代码: 全选
#!/bin/bash
mkfifo fifo && exec 7<>fifo && rm fifo
for n in {1..3}
do
echo >&7
done
for i in {1..39}
do {
read -u7
for j in {1..5}
do
echo $i file $j time
mkdir $$
./you-get/you-get `sed -n "$i"p urls` -o $$
if [ $? != 0 ]
then
mv $$/*mp4 .
rmdir $$
fi
done
echo >&7
} &
done
wait
exec 7>&-
exec 7<&-