在shell中使用变量和多处理的cURL [重复]

问题描述 投票:0回答:2

我一直试图解决这个问题几天没有运气。我想要做的是用我的本地IP提供我的curl json,尽可能快地处理多个cURL并将变量接收回文件。

我的第一个代码运行正常,但他正在逐行处理并且需要永恒。我想运行像xargs或parallel这样的东西。

我有以下.txt文件(IP.txt):

192.168.1.100
192.168.1.102
192.168.1.104
192.168.1.105
192.168.1.106
192.168.1.168
...

我正在将此文件提供给代码:

cat IP.txt | while read LINE; do

C_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data '{"method":"data","params":[]}' $LINE:80 | jq -r '.result[]')

for F_RESPONSE in $C_RESPONSE; do
echo $LINE $F_RESPONSE >> output.txt

done
done

此脚本的输出如下:

192.168.1.100 value_1
192.168.1.100 value_2
192.168.1.100 value_3
192.168.1.100 value_4
192.168.1.100 value_5
192.168.1.102 value_1
192.168.1.102 value_2
192.168.1.102 value_3
192.168.1.104 value_1
192.168.1.104 value_2
192.168.1.104 value_3
192.168.1.104 value_4
192.168.1.104 value_5
192.168.1.104 value_6
192.168.1.104 value_7
192.168.1.104 value_8
192.168.1.104 value_9
192.168.1.104 value_10
192.168.1.105 value_1
192.168.1.105 value_2
192.168.1.106 value_1
192.168.1.168 value_1
...

我希望使用parallel或xargs甚至&使代码更快。但是添加&:

C_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data '{"method":"data","params":[]}' $LINE:80 | jq -r '.result[]') &

我正在将脚本发送到后台,我无法处理

for F_RESPONSE in $C_RESPONSE; do
echo $LINE $F_RESPONSE >> output.txt

使用这样的并行命令,我只能生成值,但我看不到IP:

cat IP.txt | parallel -j200 "curl -H 'Content-Type: application/json' {}:80 -X POST -d '{\"method\":\"data\",\"params\":[]}'" | jq -r '.result[]' >> output.txt

value_1
value_2
value_3
value_4
value_5
value_1
value_2
value_3
value_1
value_2
value_3
value_4
value_5
value_6
value_7
value_8
value_9
value_10
value_1
value_2
value_1
value_1
...

我已经尝试使用谷歌搜索和阅读许多教程,但没有运气。我怎么解决这个问题?

谢谢!

所以这是@Poshi提出的快速解决方案。解决方案没有限制因素,因此如果运行太多后台作业会导致问题。

#!/bin/bash

function call() {
    arg1=$1
    C_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data '{"method":"data","params":[]}' $arg1:80 | jq -r '.result[]')

    for F_RESPONSE in $C_RESPONSE; do
    echo $arg1 $F_RESPONSE >> output.txt
done
}

cat IP.txt | while read LINE; do

call $LINE &

done
bash variables curl multiprocessing output
2个回答
0
投票

xargs -P是为这项工作而建的工具。 (GNU并行甚至更多,但它是一堆乱用的语义,使其使用容易出错,因此我不推荐使用它;请参阅https://lists.gnu.org/archive/html/bug-parallel/2015-05/msg00005.html的邮件列表主题)。

call() {
  : # put your definition here
}
export -f call # make that function accessible to child processes

# tell xargs to start 4 shells (adjust to taste!) processing lines.
# presently, this gives each shell 16 jobs to reduce startup overhead
# ...adjust to tune for your actual workload.
<IP.txt xargs -n 16 -d $'\n' -P4 bash -c 'for line; call "$line"; done' _

0
投票

作为对代码的改进,您可以考虑为初始化的进程数添加控制。检查我的答案如下

#!/bin/bash

function call() {
    arg1=$1
    C_RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" --data '{"method":"data","params":[]}' $arg1:80 | jq -r '.result[]')

    for F_RESPONSE in $C_RESPONSE; do
    echo $arg1 $F_RESPONSE >> output.txt
done
}

cat IP.txt | while read LINE; do

while (($(pgrep -P "$$" curl | wc -l)> 10))
do
    sleep 0,2;
done

call $LINE &

done
© www.soinside.com 2019 - 2024. All rights reserved.