Linux下模擬多執行緒的併發併發shell指令碼

2022-09-13 07:39:11 字數 1485 閱讀 6485

分享乙個在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...