使用GNU Parallel运行循环bash卷曲脚本

时间:2018-03-19 10:08:58

标签: bash curl gnu-parallel

刚刚开始用bash编程并遇到了GNU Parallel,这正是我项目所需要的。 有一个基本的循环脚本,它用于遍历ip列表并且每次都ping一次。带有ip的列表会不断更新,由其他脚本驱动。

对于多线程,我想使用GNU Parallel。

我的想法是运行10个并行实例,每个实例将从列表中捕获一个ip,将其插入curl命令并将其从列表中删除,因此其他实例不会选择它。

#! /bin/bash
while true; do

while read -r ip; do
curl $ip >> result.txt
sed -i '1,1 d' iplist
done < ipslist
done

我不确定,运行bash脚本的正确方法是什么,在这种情况下,我找到的每个解决方案都没有正常工作,事情变得非常混乱。 我有一种感觉,这一切都可以用一行完成,但是,出于我自己的原因,我更喜欢将它作为bash脚本运行。 非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

这对我有用:

$objectArray | Select-Object DisplayName, LoginName, Url -Unique

如果这不符合您的意图,请更新您的问题以澄清。

答案 1 :(得分:1)

托马斯&#39;解决方案对于这种特殊情况看起来是正确的。但是,如果您需要做的不仅仅是curl,那么我建议您创建一个函数:

#! /bin/bash

doit() {
  ip="$1"
  curl "$ip"
  echo do other stuff here
}
export -f doit

while true; do
  parallel -j10 doit < ipslist >> result.txt
done

如果您希望ipslist成为一个队列,以便稍后可以向队列中添加内容,而您只需要curl一次:

tail -n+0 -f ipslist | parallel doit >> result.txt

现在你可以稍后将内容添加到ipslist,GNU Parallel curl也可以。

(使用GNU parallel作为队列系统/批处理时存在一个小问题    经理:你必须先提交JobSlot的工作数量    开始,然后你可以一次提交一个,然后开始工作    如果有空闲插槽,请立即运行或输出    已完成的作业将被取消,只有在JobSlots更多时才会打印    作业已经开始(除非你使用--ungroup或--line-buffer,in    在哪种情况下,作业的输出立即打印)。例如。如果    你有10个工作岗位,然后第一个完成的工作的输出将    仅在作业11开始时打印,而第二个输出    只有在作业12开始时才会打印完成的作业。)

答案 2 :(得分:0)

我会使用xargs。似乎并不是很多人都知道这一点,但是除了标准用法之外,只需在一条线上挤压每一行输入。就是这样:

echo -e "A\nB\nC\nD\nE" | xargs do_something

基本上与此相同:

do_something A B C D E

但是,您可以使用-L选项指定在一个块中处理的行数:

echo -e "A\nB\nC\nD\nE" | xargs -L2 do_something

会转换为:

do_something A B
do_something C D

此外,您还可以使用-P选项指定并行运行的这些块中的多少个。因此,为了逐行处理这些行,比如说3的并行性,你会说:

echo -e "A\nB\nC\nD\nE" | xargs -L1 -P3 do_something

Etvoilà,你有适当的并行执行,使用基本的unix工具。

唯一的问题是,你必须确保你将输出分开。我不确定,这是否曾被考虑过,但curl案例的解决方案是这样的:

cat url_list.txt | xargs -L1 -P10 curl -o paralell_#0.html

其中#0将由cURL替换,其中提取的URL。有关详细信息,请参阅手册:

答案 3 :(得分:-1)

你可以这样做,它会起作用:

#! /bin/bash
while true; do

   while read -r ip; do
      curl $ip >> result.txt &
      sed -i '1,1 d' iplist
   done < ipslist
wait
done