From 6d6c502084423ebed8eb5573f5208017740fca68 Mon Sep 17 00:00:00 2001 From: diandian Date: Mon, 24 Apr 2023 11:30:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20'Shell-MD'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shell-MD/shell并发控制.md | 167 ++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 Shell-MD/shell并发控制.md diff --git a/Shell-MD/shell并发控制.md b/Shell-MD/shell并发控制.md new file mode 100644 index 0000000..2da1472 --- /dev/null +++ b/Shell-MD/shell并发控制.md @@ -0,0 +1,167 @@ +

shell并发控制

+ +作者:行癫(盗版必究) + +------ + +## 一:FD文件描述符 + +#### 1.FD简述 + +​ FD:文件描述符/文件句柄 + +​ 进程使用文件描述符用来管理进程打开的文件 + +```shell +[root@xingdiancloud ~]# ll /proc/$$/fd +总用量 0 +lrwx------. 1 root root 64 4月 16 23:51 0 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 1 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 2 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 255 -> /dev/pts/0 +[root@xingdiancloud ~]# touch file1 +启用自定义文件描述符打开文件 +[root@xingdiancloud ~]# exec 6<> file1 +[root@xingdiancloud ~]# ll /proc/$$/fd +总用量 0 +lrwx------. 1 root root 64 4月 16 23:51 0 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 1 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 2 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 255 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 6 -> /root/file1 +[root@xingdiancloud ~]# echo "xingdian" > /proc/$$/fd/6 +[root@xingdiancloud ~]# cat file1 +xingdian +[root@xingdiancloud ~]# rm -rf file1 +[root@xingdiancloud ~]# ll /proc/$$/fd +总用量 0 +lrwx------. 1 root root 64 4月 16 23:51 0 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 1 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 2 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 255 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 6 -> '/root/file1 (deleted)' +[root@xingdiancloud ~]# cat /proc/$$/fd/6 +xingdian +释放文件描述符 +[root@xingdiancloud ~]# exec 6<&- +[root@xingdiancloud ~]# ll /proc/$$/fd +总用量 0 +lrwx------. 1 root root 64 4月 16 23:51 0 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 1 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 2 -> /dev/pts/0 +lrwx------. 1 root root 64 4月 16 23:51 255 -> /dev/pts/0 +``` + +注意: + +​ exec打开一个文件 + +​ exec关闭一个文件(释放文件句柄) + +​ 当一个文件FD未被释放,删除源文件也不会影响FD + +#### 2.管道简述 + +匿名管道 + +```shell +[root@xingdiancloud ~]# rpm -qa | grep rpm +``` + +命令管道 + +```shell +[root@xingdiancloud ~]# mkfifo /tmp/xingdian +[root@xingdiancloud ~]# file /tmp/xingdian +/tmp/xingdian: fifo (named pipe) +[root@xingdiancloud ~]# tty +/dev/pts/0 +[root@xingdiancloud ~]# rpm -qa > /tmp/xingdian + +另一个终端 +[root@xingdiancloud ~]# grep bash /tmp/xingdian +bash-5.1.8-6.el9.x86_64 +bash-completion-2.11-4.el9.noarch +[root@xingdiancloud ~]# tty +/dev/pts/1 +``` + +#### 3.FD案例 + +```shell +[root@xingdiancloud ~]# cat a.sh +#!/bin/bash +exec 7<> /etc/hosts +exec 8<> /etc/hostname + +while read -u 7 line +do + echo $line +done +while read -u 8 line2 +do + echo $line2 +done +exec 7<&- +exec 8<&- + +[root@xingdiancloud ~]# bash a.sh +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 +xingdiancloud +``` + +4.并发案例 + +```shell +#!/usr/bin/bash +#固定线程 +read -p "请输入线程数量:" diange +diangefile=/root/diangefile +mkfifo $diangefile //虚拟管道 +exec 8<>$diangefile //文件描述 +rm -rf $diangefile + +for i in `seq $diange` +do + echo >&8 //将内容写入到描述文件中,写如了空行 +done + +for i in {1..100} +do + read -u 8 //read 读取描述文件中的内容 + { + ip=192.168.101.$i + ping -c1 $ip &>/dev/null + if [ $? -eq 0 ];then + echo "$ip is up" + else + echo "$ip is down" + + fi + echo >&8 //等到进程执行完之后再往管道里丢内容以支持后面的循环 + }& +done +wait +echo "完成" +exec 8<&- //释放描述文件 +``` + + + + + + + + + + + + + + + + + + +