Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash命令并行执行_Bash - Fatal编程技术网

bash命令并行执行

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/

我希望有两个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/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