[英]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 個輸入並且需要很多時間?
簡單的方法。 假設輸出的順序不重要,並且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
不那么簡單。 如果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.