如何将线程添加到bash脚本中?
问题描述:
#!/bin/bash
cat input.txt | while read ips
do
cmd="$(snmpwalk -v2c -c [email protected] $ips sysUpTimeInstance)"
echo "$ips ---> $cmd"
echo "$ips $cmd" >> out_uptime.txt
done
如何添加线程到这个bash脚本中,我有大约80000个输入,它需要很多时间?如何将线程添加到bash脚本中?
答
-
简单的方法。假设输出的顺序不重要,和
snmpwalk
的输出是没有兴趣如果它应该失败,在每个命令的末尾放一个&&
到后台,除了最后一个命令应该有一个&
最后:#!/bin/bash while read ips do cmd="$(nice snmpwalk -v2c -c [email protected] $ips sysUpTimeInstance)" && echo "$ips ---> $cmd" && echo "$ips $cmd" >> out_uptime.txt & done < input.txt
-
不那么简单。如果
snmpwalk
可能会失败,并且该输出也是需要的,则丢失&&
并用大括号{}
,后跟&
围绕代码。重定向所附输出到包括标准误差使用&>>
:#!/bin/bash while read ips do { cmd="$(nice snmpwalk -v2c -c [email protected] $ips sysUpTimeInstance)" echo "$ips ---> $cmd" echo "$ips $cmd" &>> out_uptime.txt } & done < input.txt
撑杆可以包含更复杂的
if ... then ... else ... fi
声明,所有这些都将后台运行。
对于那些不具备复杂的snmpwalk
命令测试谁,这里有一个类似的循环,打印一到五,但echo
命令之间休眠随机的持续时间:
for f in {1..5}; do
RANDOM=$f &&
sleep $((RANDOM/6000)) &&
echo $f &
done 2> /dev/null | cat
每次输出将相同(取出RANDOM=$f &&
以改变输出),并且需要三秒钟运行:
2
4
1
3
5
与此相比,代码不的&&
S和&
:
for f in {1..5}; do
RANDOM=$f
sleep $((RANDOM/6000))
echo $f
done 2> /dev/null | cat
运行时,代码需要秒运行,与此输出:
1
2
3
4
5
答
您可以通过&
将任务发送到背景。如果你想等待一个
process_to_background &
echo Processing ...
wait
echo Done
你可以得到给定任务的PID开始在后台(或几个:如果要等待所有的人才能完成,你可以使用wait
命令)具体任务。
important_process_to_background &
important_pid=$!
while i in {1..10}; do
less_important_process_to_background $i &
done
wait $important_pid
echo Important task finished
wait
echo All tasks finished
但请注意:后台进程可能会混淆输出,因为它们将异步运行。您可能需要使用命名管道来收集它们的输出。
使用一个程序,处理多个IP而不是调用'snmpwalk' 80,000次。 – chepner
@chepner,显然OP不会知道替换项是否存在。替代程序的*名称*比暗示未命名程序更有帮助。 – agc
SNMP是一种协议;使用SNMP库的自定义程序更有可能比试图找到适合用例的其他程序更有用。关键是,多次重复运行一次性程序几乎不是正确的方法。 – chepner