我一直在尝试在一个巨大的循环中制作 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,这将重新启动编号。