日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

liunx shell腳本并發控制詳解

作者:小吳-斌 更新時間: 2023-08-30 編程語言

并發控制實例

腳本實現多線程并發控制的原理:
首先定義并發的數量,然后創建管道文件,并往管道文件中插入數據(可以是空行),
然后定義分隔符,以分隔符xx運行管道文件,
在刪除管道文件,因為刪除管道文件不會影響句柄,
在使用read -u命令讀取分隔符內容,
如果能讀到數據則執行對應的后臺進程,如果讀取不到則一直等待,
并發進程并不是等所有都執行完一輪后在執行新的一輪,而是完成一個后就會返回,
比如控制 的并發數是50,那么始終都會是50個后臺進程一起執行,直到程序結束

模擬并發示例

#!/bin/bash
#------------創建用戶實現并發控制------------
#------------shell多線程/多進程-------------------
#定義腳本運行的開始時間
start_time=`date +%s`              
#并發數量,一次性能同時存在多少個進程
bfcs=50

#管道文件
fifofile=/tmp/fd_test.fifo

#創建管道文件
mkfifo $fifofile

#打開管道文件并定義為分隔符4
exec 4<> $fifofile

#刪除管道文件
rm -rf $fifofile

#向管道文件插入空行
for i in $(seq $bfcs)
do
	echo >&4
done

for i in $(seq -w 1000)
do
	read -u 4       #讀取分隔符4,如果讀到行則執行下面命令,否則一直等待
	{
		sleep 1  #sleep 1用來模仿執行一條命令需要花費的時間(可以用真實命令來代替)
		echo 'success'$i       
		echo >&4        #當運行完命令后則重新向管道文件插入新的行,以便后續進程進行使用
	}&
done
wait
exec 4>&-               #當所有循環完成后釋放分隔符
echo "finish........."
stop_time=`date +%s`  #定義腳本運行的結束時間
 
echo "TIME:`expr $stop_time - $start_time`" 

ping主機實現并發控制

#!/bin/bash
#----------------------控制進程并發數量---------------------
#-------------shell多進程/多線程------------------
#定義腳本運行的開始時間
start_time=`date +%s`
#定義控制并發的數量
bfsl=10

#定義管道文件
fifofile=/tmp/fdping.fifo

#創建管道文件
mkfifo $fifofile

#以文件描述符3打開管道文件
exec 3<> $fifofile

#刪除管道文件,因為文件描述符打開的文件即使刪除句柄也不會被釋放
rm -rf $fifofile

#循環往管道文件中寫入內容
for i in $(seq $bfsl)
do
	echo >&3        #這個表示只寫入回車
done

for i in {1..254}
do
	read -u 3       #-u表示對文件描述符進行讀取,如果能讀取則執行下面的命令,如果不能則等待
	{
	ip=192.168.81.$i
	ping -c1 -W1 $ip &>/dev/null
	if [ $? -eq 0 ];then
			echo "$ip is up"
	else
			echo "$ip is down"
	fi
	echo >&3        #由于之前是從管道文件中讀走了一行,這里要在還回去一行,讓后面的進程進行使用
	}&
done
wait
exec 3>&-               #釋放文件描述符
echo "finish.............." 

stop_time=`date +%s`  #定義腳本運行的結束時間 
echo "TIME:`expr $stop_time - $start_time`"

創建用戶實現并發控制

#!/bin/bash
#------------創建用戶實現并發控制------------
#------------shell多線程/多進程-------------------
#定義腳本運行的開始時間
start_time=`date +%s`
#并發數量,一次性能同時存在多少個進程
bfcs=50

#管道文件
fifofile=/tmp/user_fd.fifo

#創建管道文件
mkfifo $fifofile

#打開管道文件并定義為分隔符4
exec 4<> $fifofile

#刪除管道文件
rm -rf $fifofile

#向管道文件插入空行
for i in $(seq $bfcs)
do
	echo >&4
done

for i in $(seq -w 1000)
do
	read -u 4       #讀取分隔符4,如果讀到行則執行下面命令,否則一直等待
	{
	user=qwe$i
	useradd $user
	echo "123" |passwd --stdin $user &>/dev/null
	if [ $? -eq 0 ];then
			echo "$user is created..."
	fi
	echo >&4        #當運行完命令后則重新向管道文件插入新的行,以便后續進程進行使用
	}&
done
wait
exec 4>&-               #當所有循環完成后釋放分隔符
echo "finish........."
stop_time=`date +%s`  #定義腳本運行的結束時間 
echo "TIME:`expr $stop_time - $start_time`"

原文鏈接:https://blog.csdn.net/qq_23564667/article/details/127203829

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新