我有一个脚本,每隔Y分钟就会多次向同一个服务器发出X请求,而且当前不使用任何流水线操作/ HTTP Keep-Alive,部分原因是每个请求必须在输出中以头部开头。
#!/bin/sh -x
for k in $(jot 6)
do
while read i
do
echo -n $i
curl -s "http://example.org/?param=$i" | fgrep result
done <<EOF
some
uri
data
here
EOF
sleep 600
done
我想要的是将其转换为每个批次使用example.com
的单个连接,而不是为每个请求建立一个新连接。
请注意,由于必须打印标题,例如,流水线操作会很复杂。 echo -n $i
。
约束:每个请求可能有一行或一行与我们尝试fgrep
的字符串匹配(因此,当前脚本也会部分损坏,因为它如果有0行,则不会打印\n
。
我理想情况下正在寻找sh
解决方案,但我也可以使用perl
和python2.7
,如果这不会花费太长时间。 (以及curl
和wget
,以及OpenBSD的所有其他内容。)
答案 0 :(得分:1)
纯粹的基于shell的解决方案可能无法工作,因为在执行keep-alive / pipelining时必须重用相同的TCP连接。但是,你当前的解决方案并不是完全基于shell的,因为它一直调用curl和fgrep,如果这是你对shell解决方案的理解,那么你的shell也可以调用Perl和Python。
我建议只使用LWP(Perl)或请求(Python)库,它们都使用HTTP keep-alive。关于如何使用这些库有足够的例子,所以不需要在这里重复它。除了版本之间的行为可能不同之外(例如,如果默认情况下是否保持HTTP keep-alive,并且未知OpenBSD版本上安装了哪些版本)。 HTTP流水线操作更难,但在大多数情况下不会比保持活动更加快速(可能用于非常小的请求)。另请注意,keep-alive并不会神奇地加速所有内容,因为它也必须在服务器端支持。虽然大多数服务器实现它,但有时会关闭它以使用更少的资源。