gpt4 book ai didi

linux - 如何向 bash 脚本添加线程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:06 25 4
gpt4 key购买 nike

#!/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

运行时,代码需要 7 秒才能运行,输出如下:

1
2
3
4
5

关于linux - 如何向 bash 脚本添加线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43784650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com