[英]How to add threading to the bash script?
#!/bin/bash
cat input.txt | while read ips
do
cmd="$(snmpwalk -v2c -c abc@123 $ips sysUpTimeInstance)"
echo "$ips ---> $cmd"
echo "$ips $cmd" >> out_uptime.txt
done
我如何向这个 bash 脚本添加线程,我有大约 80000 个输入并且需要很多时间?
简单的方法。 假设输出的顺序不重要,并且snmpwalk
的输出如果失败则无关紧要,在每个命令的末尾放置一个&&
到后台,除了最后一个命令的末尾应该有一个&
:
#!/bin/bash while read ips do cmd="$(nice snmpwalk -v2c -c abc@123 $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 abc@123 $ips sysUpTimeInstance)" echo "$ips ---> $cmd" echo "$ips $cmd" &>> out_uptime.txt } & done < input.txt
大括号可以包含更复杂的if ... then ... else ... fi
语句,所有这些都将是后台的。
对于那些没有复杂的snmpwalk
命令来测试的人,这里有一个类似的循环,它打印 1 到 5,但在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
将其与没有&&
和&
代码进行比较:
for f in {1..5}; do
RANDOM=$f
sleep $((RANDOM/6000))
echo $f
done 2> /dev/null | cat
运行时,代码需要七秒钟才能运行,输出如下:
1
2
3
4
5
您可以通过&
将任务发送到后台。 如果您打算等待所有这些完成,您可以使用wait
命令:
process_to_background &
echo Processing ...
wait
echo Done
如果您想等待一个(或几个)特定任务,您可以获取在后台启动的给定任务的pid 。
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
但请注意:后台进程可能会弄乱输出,因为它们将异步运行。 您可能希望使用命名管道来收集它们的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.