【问题标题】:Bash increase pid kernel to unlimited for huge loopBash 将 pid 内核增加到无限大循环
【发布时间】:2019-07-11 08:05:32
【问题描述】:

我一直在尝试在一个巨大的循环中创建 cURL,并使用 bash 将 cURL 运行到后台进程中,大约有 904 个域将被 cURL

问题在于,由于 Linux 内核的 PID 限制,不能全部嵌入 904 个域。我曾尝试将 pid_max 添加到 4194303(我在此讨论中读到 Maximum PID in Linux),但在我检查只有域 901 已在后台进程中运行之后,在我添加 pid_max 之前仅在 704 左右在后台进程中运行。

这是我的循环代码:

count=0
while IFS= read -r line || [[ -n "$line" ]]; 
    do
      (curl -s -L -w "\\n\\nNo:$count\\nHEADER CODE:%{http_code}\\nWebsite : $line\\nExecuted at :$(date)\\n==================================================\\n\\n" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line >> output.log) &

  (( count++ ))
done < $FILE_NAME

有人有其他解决方案或修复它来处理巨大的循环以将 cURL 运行到后台进程吗?

【问题讨论】:

  • xargs -P 选项可能有助于限制一次进程的数量
  • 你能解释一下吗?
  • 我在发布代码之前添加了注释,由于count变量似乎并不容易,否则可能是xargs -n1 -P50 bash -c '....' - &lt; "$FILE_NAME",其中50是一次运行的进程数,.... 要执行的命令,"$1" 要使用的参数,'- 代表 "$0"
  • ` --process-slot-var=count` 可用于从this answer传递索引

标签: linux bash shell


【解决方案1】:

可以创建脚本example.sh

#!/bin/bash

line=$1
curl -s -L -w "\\n\\nNo:$count\\nHEADER CODE:%{http_code}\\nWebsite : $line\\nExecuted at :$(date)\\n==================================================\\n\\n" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line >> output.log

那么命令可以是(将一次运行的进程数限制为50)

xargs -n1 -P50 --process-slot-var=count ./example.sh < "$FILE_NAME"

【讨论】:

  • 所以这里的while循环可以由xargs处理?
  • 是的,xargs 本质上是“从标准输入构建和执行命令行”,有关更多详细信息,请参阅man xargs
  • xargs -n1 -P50 --process-slot-var=count ./deployer.sh &lt; "$FILE_NAME" 它显示消息 bash: : No such file or directory ,尽管该文件在当前目录中可用
  • @0x00b0 您是否设置了 FILE_NAME 变量?这个错误会发生在空重定向echo &lt; ""
  • 在发布的代码中还有 SECRET_KEY 也应该设置
【解决方案2】:

即使您可以并行运行这么多进程,这也毫无意义 - 在短时间内启动许多 DNS 查询来解析 900 多个域名可能会使您的 DNS 服务器不堪重负,并且在同时会阻塞你的网络。一种更好的方法是使进程涓涓细流,以便您在任何给定时间运行有限数量(例如 100 个),但每次之前启动的进程之一完成时都启动一个新进程。使用xargs -P 这很容易。

xargs -I {} -P 100 \
    curl -s -L \
        -w "\\n\\nHEADER CODE:%{http_code}\\nWebsite : {}\\nExecuted at :$(date)\\n==================================================\\n\\n" \
        -H "X-Gitlab-Event: Push Hook" \
        -H "X-Gitlab-Token: $SECRET_KEY" \
        --insecure {} <"$FILE_NAME" >output.log

$(date) 结果将在 shell 评估 xargs 命令行时被插值,并且没有简单的方法可以使用这种机制获得 count。重构它以将 curl 命令和一些脚手架放入单独的脚本中可以解决这些问题,如果它对您真的很重要,那么应该是微不足道的。 (粗略的草图:

xargs -P 100 bash -c 'count=0; for url; do

        curl --options --headers "X-Notice: use double quotes throughout" \
            "$url"
        ((count++))
    done' _ <"$FILE_NAME" >output.log

...尽管如果xargs 收到的 URL 数量超过单个命令行的容量,这将重新开始编号。)

【讨论】:

  • TIL xargs --process-slot-var 存在,但它是一个相对较新的功能并且仅限于 GNU。如果你有它,一定要使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 2017-06-20
  • 2012-07-21
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
相关资源
最近更新 更多