2017-05-04 85 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

相關問題