簡體   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