(4.14)Fd和命名管道實現shell併發控制

1.shell併發控制之描述符

  • File Descriptors(FD,文件描述符)或者文件句柄
    進程使用文件描述符來管理打開的文件
ls /proc/$$/fd
0 1 2 3 4
0:標準輸入
1:標準輸出
2:標準錯誤輸出

在這裏插入圖片描述

在這裏插入圖片描述

  • exec打開一個文件
touch /file1
exec 6 <> /file1##手動打開了一個文件描述符,給他一個6描述符

在這裏插入圖片描述

  • 因爲文件句柄沒有釋放,所以文件內容還在 ,所以可以copy出來,但是前後兩個file1文件的inode編號不一樣了!
    當一個文件FD未釋放,刪除源文件也不會影響FD
    在這裏插入圖片描述
    在這裏插入圖片描述
  • exec關閉一個文件(釋放一個文件句柄
exec 6<&-##關閉一個文件描述符,釋放掉當前進程的文件句柄6

在這裏插入圖片描述

2.shell併發控制之管道

  • 管道是一個文件
  • 匿名管道:你放到裏面的內容,被別人拿走就沒了;在一個進程玩
  • 命名管道:先進先出,內容讀完就沒了;兩個進程去玩
mkfifo /tmp/fifo1
file /tmp/fifo1
ll /dev/ > /tmp/fifo1

接着查看管道中的內容
grep 'sda' /tmp/fifo1

3.併發控制樣例

  • eg1:
#ping01
#!/usr/bin/bash
thread=5#進程數量
tmp_fifofile=/tmp/$$.fifo

mkfifo $tmp_fifofile
exec 8<> $tmp_fifofile
rm $tmp_fifofile		##描述符8還存在

for i in `seq $thread`
do
	echo >&8 ##&8指的就是文件描述符8,單個echo就是回車
done


for i in {2..254}
do
	read -u 8
	{
		ip=192.168.122.$i
		ping -c1 -W1 $ip &>/dev/null  ## -W1表示1秒超時
		if [ $? -eq 0 ];then
			echo "$ip is up"
		else
			echo "$ip is down"
		fi
		echo >&8##上面的事做完了,就還回去。不要都借完了,再還回去,保證管道的輸入有5個數據輸入
	}&
done
wait ##等待所有的後臺進程執行結束,如果不加這裏,有些ping執行不成功,就會執行echo "finish"
exec 8>&- 
echo "finish"

執行的話,5個,5個一起出結果

在這裏插入圖片描述

#!/bin/bash
#ping01
#!/usr/bin/bash
for i in {2..254}
do
	{
		ip=192.168.122.$i
		ping -c1 -W1 $ip &>/dev/null  ## -W1表示1秒超時
		if [ $? -eq 0 ];then
			echo "$ip is up"
		else
			echo "$ip is down"
		fi
	}&
done
wait ##等待所有的後臺進程執行結束,如果不加這裏,有些ping執行不成功,就會執行echo "finish"
echo "finish"


#!/bin/bash
#ping01
#!/usr/bin/bash
for i in {1..100}
do
	{
		user=abc$i
		useradd $user
		echo "111"|passwd --stdin $user &>/dev/null
		if [ $? -eq 0 ];then
			echo "$user is created"
		else
			echo "$user is not created"
		fi
	}&
done
wait ##等待所有的後臺進程執行結束,如果不加這裏,有些ping執行不成功,就會執行echo "finish"
echo "finish"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章