多執行緒執行shell指令碼

2021-08-14 03:46:31 字數 1485 閱讀 3754

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