刚刚开始用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脚本运行。 非常感谢任何帮助!
答案 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