2017-05-04 81 views
1
#!/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脚本中?

+1

使用一个程序,处理多个IP而不是调用'snmpwalk' 80,000次。 – chepner

+0

@chepner,显然OP不会知道替换项是否存在。替代程序的*名称*比暗示未命名程序更有帮助。 – agc

+0

SNMP是一种协议;使用SNMP库的自定义程序更有可能比试图找到适合用例的其他程序更有用。关键是,多次重复运行一次性程序几乎不是正确的方法。 – chepner

回答

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

它运行良好,但需要全部cpu利用率,以任何方式将其减少到少一点,或者你可以通过代码控制CPU utiiz – Zeal

+0

@Zeal,有点固定。请参阅'man nice',也[限制进程不超过CPU使用率的10%](https://unix.stackexchange.com/questions/151883/limiting-processes-to-not-exceed-more-than- 10的CPU的使用率/ 193996#193996)。 – agc

+0

谢谢!如果你知道它是如何工作的,Linux是非常好的。我会探索你给出的好命令和链接。 – Zeal

0

您可以通过&将任务发送到背景。如果你想等待一个

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 

但请注意:后台进程可能会混淆输出,因为它们将异步运行。您可能需要使用命名管道来收集它们的输出。

+0

我是bash和linux的新手,是否可以修改上面的脚本以包含多处理而不丢失输出? – Zeal

+0

诀窍是获得每个bg进程的退出代码 – SaintHax

相关问题