Bash 多重卷曲与限制并行

Bash 多重卷曲与限制并行,bash,unix,curl,parallel-processing,Bash,Unix,Curl,Parallel Processing,我有一个json文件,其中的条目包含URL(以及其他内容),我使用curl检索它。 我希望能够一次运行几次循环以加快速度,但也希望限制平行卷发的数量,以避免被远程服务器踢出。 现在,我的代码是 jq -r '.entries[] | select(.enabled != false) | .id,.unitUrl' $fileIndexFeed | \ while read unitId; do read -r unitUrl if ! in_array tabAnnon

我有一个json文件,其中的条目包含URL(以及其他内容),我使用curl检索它。 我希望能够一次运行几次循环以加快速度,但也希望限制平行卷发的数量,以避免被远程服务器踢出。 现在,我的代码是

  jq -r '.entries[] | select(.enabled != false) | .id,.unitUrl' $fileIndexFeed | \
  while read unitId; do
    read -r unitUrl
    if ! in_array tabAnnoncesExistantesIds $unitId; then
      fullUnitUrl="$unitUrlBase$unitUrl"
      unitFile="$unitFileBase$unitId.json"
      if [ ! -f $unitFile ]; then
        curl -H "Authorization:$authMethod $encodedHeader" -X GET $fullUnitUrl -o $unitFile
      fi
    fi
   done
如果我在curl结束时使用simple&它将运行大量并发请求,我可能会被踢。 所以,问题是(我想):如何知道一个带有&的旋度已经完成了它的工作?如果我能检测到,那么我想我可以测试,递增和递减一个变量,告诉你跑步卷发的数量


谢谢

使用GNU Parallel来控制并行作业的数量。将
curl
命令写入文件,以便查看并检查它们:

commands.txt

curl "something" "somehow" "toSomewhere"
curl "somethingelse" "someotherway" "toSomewhereElse"
然后,如果希望一次运行的作业不超过8个,请运行:

parallel -j 8 --eta -a commands.txt
或者,您可以将命令写入GNU Parallel的
stdin

jq ... | while read ...; do
    printf "curl ..." 
done | parallel -j 8 

使用GNU Parallel来控制并行作业的数量。将
curl
命令写入文件,以便查看并检查它们:

commands.txt

curl "something" "somehow" "toSomewhere"
curl "somethingelse" "someotherway" "toSomewhereElse"
然后,如果希望一次运行的作业不超过8个,请运行:

parallel -j 8 --eta -a commands.txt
或者,您可以将命令写入GNU Parallel的
stdin

jq ... | while read ...; do
    printf "curl ..." 
done | parallel -j 8 
使用Bash函数:

doit() {
  unitId="$1"
  unitUrl="$2"
  if ! in_array tabAnnoncesExistantesIds $unitId; then
    fullUnitUrl="$unitUrlBase$unitUrl"
    unitFile="$unitFileBase$unitId.json"
    if [ ! -f $unitFile ]; then
      curl -H "Authorization:$authMethod $encodedHeader" -X GET $fullUnitUrl -o $unitFile
    fi
  fi
}

jq -r '.entries[] | select(.enabled != false) | .id,.unitUrl' $fileIndexFeed |
  env_parallel -N2 doit
env_parallel
将导入环境,因此所有shell变量都可用。

使用Bash函数:

doit() {
  unitId="$1"
  unitUrl="$2"
  if ! in_array tabAnnoncesExistantesIds $unitId; then
    fullUnitUrl="$unitUrlBase$unitUrl"
    unitFile="$unitFileBase$unitId.json"
    if [ ! -f $unitFile ]; then
      curl -H "Authorization:$authMethod $encodedHeader" -X GET $fullUnitUrl -o $unitFile
    fi
  fi
}

jq -r '.entries[] | select(.enabled != false) | .id,.unitUrl' $fileIndexFeed |
  env_parallel -N2 doit

env_parallel
将导入环境,因此所有shell变量都可用。

是否在运行curl命令帮助之前检查ps-ef | grep-i curl | wc-l?如果系统中运行的curl进程数量已达到您定义的限制,则可以保持检查睡眠状态。一旦进程数减少,就可以运行下一个curl。这是必需的吗?在运行curl命令之前检查ps-ef | grep-i curl | wc-l是否有帮助?如果系统中运行的curl进程数量已达到您定义的限制,则可以保持检查睡眠状态。一旦进程数减少,就可以运行下一个curl。这是必需的吗?这真的为我指明了正确的方向:我将进程分成几个部分以提高效率,因为bash中的in_数组函数速度非常慢。我得到了URL的完整列表,用php清理了它,生成了一个文本文件,然后才使用bash来并行它。因为所有的预处理都是在外面进行的,所以这要简单得多。无论如何,非常感谢,你为我节省了很多时间。这确实为我指明了正确的方向:我将进程分成几个部分,以提高效率,因为bash中的in_数组函数速度非常慢。我得到了URL的完整列表,用php清理了它,生成了一个文本文件,然后才使用bash来并行它。因为所有的预处理都是在外面进行的,所以这要简单得多。无论如何,非常感谢,你帮我省了几个小时。