分享乙個在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
模擬多執行緒
用兩個執行緒玩猜數字遊戲,第乙個執行緒負責隨機給出1 100之間的乙個整數,第二個執行緒負責猜出這個數。要求每當第二個執行緒給出自己的猜測後,第乙個執行緒都會提示 猜小了 猜大了 或 猜對了 猜數之前,要求第二個執行緒要等待第乙個執行緒設定好要猜測的數。第乙個執行緒設定好猜測數之後,兩個執行緒還要相...
curl模擬多執行緒
開啟會話 設定會話引數 傳送請求 關閉控制代碼 請求鏈結 arr foreach arr as key url 執行curl會話 res curl exec ch 關閉curl會話並釋放資源 curl close ch 指令碼開始的毫秒時刻 start microtime true 鏈結陣列 arr...
模擬多人售票的多執行緒測試
01classlockdemocatch exception e 06 07tt.lockname vip clinet1 saler b was late for work,but 08 later is better than never 09newthread tt start 10 11 1...