繁体   English   中英

如何将线程添加到 bash 脚本?

[英]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 个输入并且需要很多时间?

  1. 简单的方法。 假设输出的顺序不重要,并且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
  2. 不那么简单。 如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM