bash命令并行执行
我希望有两个youtube dl进程(或尽可能多的进程)并行运行。请告诉我怎么做。提前谢谢bash命令并行执行,bash,Bash,我希望有两个youtube dl进程(或尽可能多的进程)并行运行。请告诉我怎么做。提前谢谢 #!/bin/bash #package: youtube-dl axel #file that contains youtube links FILE="/srv/backup/temp/youtube.txt" #number of lines in FILE COUNTER=`wc -l $FILE | cut -f1 -d' '` #download destination cd /srv/
#!/bin/bash
#package: youtube-dl axel
#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"
#number of lines in FILE
COUNTER=`wc -l $FILE | cut -f1 -d' '`
#download destination
cd /srv/backup/transmission/completed
if [[ -s $FILE ]]; then
while [ $COUNTER -gt 0 ]; do
#get video link
URL=`head -n 1 $FILE`
#get video name
NAME=`youtube-dl --get-filename -o "%(title)s.%(ext)s" "$URL" --restrict-filenames`
#real video url
vURL=`youtube-dl --get-url $URL`
#remove first link
sed -i 1d $FILE
#download file
axel -n 10 -o "$NAME" $vURL &
#update number of lines
COUNTER=`wc -l $FILE | cut -f1 -d' '`
done
else
break
fi
解决方案
您需要运行,即将命令放入(cmd)&
定义
shell脚本本身可以启动子进程。这些子壳让
脚本执行并行处理,实际上执行多个子任务
同时
代码
对于您来说,我想它会是这样的(我在$vURL
中加上引号):
解决方案
您需要运行,即将命令放入(cmd)&
定义
shell脚本本身可以启动子进程。这些子壳让
脚本执行并行处理,实际上执行多个子任务
同时
代码
对于您来说,我想它会是这样的(我在$vURL
中加上引号):
我不知道这是否是最好的方法,您可以定义一个函数,然后在后台调用它 大概是这样的:
#!/bin/bash
#package: youtube-dl axel
#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"
# define a function
download_video() {
sleep 3
echo $1
}
while read -r line; do
# call it in background, with &
download_video $line &
done < $FILE
#/bin/bash
#包装:youtube dl axel
#包含youtube链接的文件
FILE=“/srv/backup/temp/youtube.txt”
#定义函数
下载视频({
睡眠3
回声1美元
}
而read-r行;做
#在后台用&
下载视频$line&
完成<$FILE
脚本很快结束,但函数仍在后台运行,3秒后将显示回声
还使用了read和while循环来简化文件读取我不知道这是否是最好的方法,您可以定义一个函数,然后在后台调用它 大概是这样的:
#!/bin/bash
#package: youtube-dl axel
#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"
# define a function
download_video() {
sleep 3
echo $1
}
while read -r line; do
# call it in background, with &
download_video $line &
done < $FILE
#/bin/bash
#包装:youtube dl axel
#包含youtube链接的文件
FILE=“/srv/backup/temp/youtube.txt”
#定义函数
下载视频({
睡眠3
回声1美元
}
而read-r行;做
#在后台用&
下载视频$line&
完成<$FILE
脚本很快结束,但函数仍在后台运行,3秒后将显示回声
还使用了read和while循环来简化文件读取以下是我的看法。通过避免使用几个命令,您应该可以看到速度上的一些小的提高,尽管这可能并不明显。我添加了错误检查,这可以节省您在断开的URL上的时间
#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"
while read URL ; do
[ -z "$URL" ] && continue
#get video name
if NAME=$(youtube-dl --get-filename -o "%(title)s.%(ext)s" "$URL" --restrict-filenames) ; then
#real video url
if vURL=$(youtube-dl --get-url $URL) ; then
#download file
axel -n 10 -o "$NAME" $vURL &
else
echo "Could not get vURL from $URL"
fi
else
echo "Could not get NAME from $URL"
fi
done << "$FILE"
包含youtube链接的文件
FILE=“/srv/backup/temp/youtube.txt”
读取URL时;做
[-z“$URL”]&继续(&C)
#获取视频名称
如果名称=$(youtube dl--获取文件名-o“%(标题)s.%(ext)s”“$URL”--限制文件名);然后
#真实视频url
如果vURL=$(youtube dl——获取url$url);然后
#下载文件
axel-n 10-o“$NAME”$vURL&
其他的
echo“无法从$URL获取vURL”
fi
其他的
echo“无法从$URL获取名称”
fi
完成这是我的看法。通过避免使用几个命令,您应该可以看到速度上的一些小的提高,尽管这可能并不明显。我添加了错误检查,这可以节省您在断开的URL上的时间
#file that contains youtube links
FILE="/srv/backup/temp/youtube.txt"
while read URL ; do
[ -z "$URL" ] && continue
#get video name
if NAME=$(youtube-dl --get-filename -o "%(title)s.%(ext)s" "$URL" --restrict-filenames) ; then
#real video url
if vURL=$(youtube-dl --get-url $URL) ; then
#download file
axel -n 10 -o "$NAME" $vURL &
else
echo "Could not get vURL from $URL"
fi
else
echo "Could not get NAME from $URL"
fi
done << "$FILE"
包含youtube链接的文件
FILE=“/srv/backup/temp/youtube.txt”
读取URL时;做
[-z“$URL”]&继续(&C)
#获取视频名称
如果名称=$(youtube dl--获取文件名-o“%(标题)s.%(ext)s”“$URL”--限制文件名);然后
#真实视频url
如果vURL=$(youtube dl——获取url$url);然后
#下载文件
axel-n 10-o“$NAME”$vURL&
其他的
echo“无法从$URL获取vURL”
fi
其他的
echo“无法从$URL获取名称”
fi
完成这应该与GNU并行工作:
cd /srv/backup/transmission/completed
parallel -j0 'axel -n 10 -o $(youtube-dl --get-filename -o "%(title)s.%(ext)s" "{}" --restrict-filenames) $(youtube-dl --get-url {})' :::: /srv/backup/temp/youtube.txt
了解更多信息:这应该适用于GNU并行:
cd /srv/backup/transmission/completed
parallel -j0 'axel -n 10 -o $(youtube-dl --get-filename -o "%(title)s.%(ext)s" "{}" --restrict-filenames) $(youtube-dl --get-url {})' :::: /srv/backup/temp/youtube.txt
了解更多信息:@MattBall名称和vURL初始化如何?如何并行运行它们?@MattBall名称和vURL初始化如何?我如何并行运行它们?如何处理
NAME
和vURL
初始化?如何并行运行它们?我认为这里的技巧不是subshell,而是使命令在background@tictacbum我是说,剧本很好用。但是我想我可以让NAME
和vURL
并行运行。我试过几种方法。它们不起作用。是的,你可以,但除非这些命令执行时间超过秒,否则为什么要为了这么少的收益而使事情变得更复杂?@William$()命令替换的正确语法是什么?关于NAME
和vURL
初始化呢?如何并行运行它们?我认为这里的技巧不是subshell,而是使命令在background@tictacbum我是说,剧本很好用。但是我想我可以让NAME
和vURL
并行运行。我试过几种方法。它们不起作用。是的,你可以,但是除非这些命令需要几秒钟以上的时间来执行,否则为什么要为了这么少的收益而使事情变得更复杂?@William$()命令替换的正确语法是什么?这里不需要cat。我知道这不是答案的关键,但你应该在阅读-r行时执行;下载视频$line&;完成<$FILE
。或lines=$(cat$文件)
如果您坚持使用cat@tictacbum美好的这种结构更好。但是它仍然没有并行的NAME
和vURL
。此youtube dl命令花费的时间最长。这就是为什么我想把它们同时放在一起你不需要猫在这里。我知道这不是答案的关键,但你应该在阅读-r行时执行;下载视频$line&;完成<$FILE
。或lines=$(cat$文件)
如果您坚持使用cat@tictacbum美好的这种结构更好。但是它仍然没有并行的NAME
和vURL
。此youtube dl命令花费的时间最长。这就是为什么我想让它们并行运行NAME
和vURL
仍然按顺序运行。可以并行运行它们吗?您可以在函数中将部分从#get video name
包装到最后一个fi
,然后运行t