GNU Parallel:如何限制每台主机运行的最大网络作业数

GNU Parallel:如何限制每台主机运行的最大网络作业数

我正在使用 GNU Parallel 扫描 URL 列表(来自不同主机)是否存在漏洞,如下所示:

cat urls.txt | parallel --gnu -j 50 ./scan {}

“扫描”程序适用于一个线程中的一个 URL。我需要硬限制每个主机的并发请求(作业)数量,例如 5 个连接。我怎样才能实现这个目标?

答案1

将 url 拆分为每个主机一个文件。然后对每个文件运行“parallel -j5”。

或者对 url 进行排序,并在遇到新主机时插入分隔符 '\0',然后在 '\0' 上拆分并删除 '\0',同时将其作为块传递到新的并行实例:

sort urls.txt | 
  perl -pe '(not m://$last:) and print "\0";m://([^/]+): and $last=$1' |
  parallel -j10 --pipe --rrs -N1 --recend '\0' parallel -j5 ./scan

编辑:

我认为这会起作用:

cat urls.txt | parallel -q -j50 sem --fg --id '{= m://([^/]+):; $_=$1 =}' -j5 ./scan {}

sem是 GNU Parallel 的一部分(它是 的简写parallel --semaphore)。{= m://([^/]+):; $_=$1 =}获取主机名。-j5告诉sem我们制作一个有 5 个槽的计数信号量。--fg强制sem不在后台生成作业。通过使用主机名作为 ID,您将获得每个主机名的计数信号量。

-qparallel如果您的某些 URL 包含特殊的 shell 字符(例如 &),则需要使用该字符。需要保护它们免受 shell 扩展,因为semshell 也会扩展它们。

相关内容