这个问题在这里已有答案:
我一直试图解决这个问题几天没有运气。我想要做的是用我的本地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
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' _
作为对代码的改进,您可以考虑为初始化的进程数添加控制。检查我的答案如下
#!/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