分享乙個在linux下模擬多執行緒的併發指令碼,使用這個指令碼可以同時批量在定義數量的伺服器上執行相關命令,比起普通for/while迴圈只能順序一條一條執行的效率高非常多,在管理大批伺服器時非常的實用。
以下指令碼功能是通過scp(也可選rsync)向上千台伺服器傳更新包,指令碼執行後同時在後台有50個scp程序向伺服器傳包。
#!/bin/bash
ip=`cat iplist.txt|grep -v "#"|awk ''` #過濾伺服器ip
dir='/usr/local/src' #目標路徑
thead_num=50 #自定義併發數,根據自身伺服器效能或應用調整大小,開始千萬別定義太大,避免管理機宕機
tmp_fifo_file="/tmp/$$.fifo" #以程序id號命名管道檔案
mkfifo $tmp_fifo_file #建立臨時管道檔案
exec 4<>$tmp_fifo_file #以讀寫方式開啟tmp_fifo_file管道檔案,檔案描述符為4,也可以取3-9任意描述符
rm -f $tmp_fifo_file #刪除臨時管道檔案,也可不刪除
for ((i=0;i<$thead_num;i++)) #利用for迴圈向管道中輸入併發數量的空行
doecho "" #輸出空行
done >&4 #輸出重導向到定義的檔案描述符4上
for i in $ip #迴圈所有要執行的伺服器
doread -u4 #從管道中讀取行,每次一行,所有行讀取完畢後執行掛起,直到管道有空閒的行
& #放入後台執行
done
wait #等待所有後台程序執行完成
exec 4>&- #刪除檔案描述符
exit 0
--------------------------------低調的分割線------------------------------------
如果管理機與其他伺服器沒有建立ssh信任,也可將expect自動應答命令新增到併發指令碼的迴圈體當中,修改如下:
#!/bin/bash
ip=`cat iplist.txt|grep -v "#"|awk ''`
dir='/usr/local/src'
answer="yes" #定義yes/no應答變數
passwd="123456" #伺服器密碼
thead_num=50
tmp_fifo_file="/tmp/$$.fifo"
mkfifo $tmp_fifo_file
exec 4<>$tmp_fifo_file
rm -f $tmp_fifo_file
for ((i=0;i<$thead_num;i++))
doecho ""
done >&4
for i in $ip
doread -u4
&done
wait
exec 4>&-
exit 0
Shell多執行緒執行指令碼示例
shell指令碼是順序執行的,但是系統允許多個shell指令碼同時執行,為了達到資源的綜合利用,也就是把伺服器往死裡用,有時候需要一段指令碼對多個指令碼進行多執行緒的排程,並且等待完成之後繼續執行後續的指令碼。主指令碼 bin bash 用於識別子執行緒的完成數量 rm test.count tou...
shell 執行shell指令碼
bin bash echo hello world 是乙個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 shell。echo 命令用於向視窗輸出文字。1 作為可執行程式 chmod x test.sh 使指令碼具有執行許可權 test.sh 執行指令碼注意,一定要寫成 test...
Shell指令碼執行
shell是乙個命令列直譯器,它為使用者提供了乙個向linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用shell來啟動 掛起 停止甚至是編寫一些程式。shell指令碼 shell script 是一種shell編寫的指令碼程式。linux的shell種類很多,常見的有 bourne a...