Bash 将 pid 内核增加到无限大循环



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

问题是 904 域不能全部嵌入,因为 Linux 内核上的 PID 限制。我尝试将pid_max添加到4194303(我在此讨论中阅读了 Linux 中的最大 PID),但在我检查后,只有域 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 运行到后台进程?

可以创建脚本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"

即使你可以并行运行那么多进程,这也是没有意义的 - 在短时间内启动许多DNS查询来解析900+域名可能会使您的DNS服务器不堪重负,并且同时拥有这么多并发传出HTTP请求会阻塞您的网络。更好的方法是涓滴这些进程,以便在任何给定时间运行有限数量(例如 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 多于单个命令行所能容纳的 URL,这将重新启动编号。

最新更新