linux-shellscript 之mkfifo使用


"FIFO"是一种特殊的文件类型,它允许独立的进程通讯. 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行.
OPTIONS(选项)

-m mode, --mode=mode
    设置创建的FIFO的模式为 mode, 这可以是 chmod(1) 中的符号模式,并使用默认模式作为起始点.

--help
    在标准输出上打印一条用法信息,并以成功状态退出.
--version

    在标准输出上打印版本信息,然后以成功状态退出.
--

    终止选项列表.
    阿
下面通过例子来说明该命令的用法:

[root@server7 ~]# mkfifo fifo //创建一个fifo
[root@server7 ~]# echo example >example.txt 
[root@server7 ~]# cat example.txt 
example
[root@server7 ~]# cat example.txt > fifo //放在后台方便
^C
[root@server7 ~]# cat example.txt > fifo &
[1] 2002
[root@server7 ~]# cat < fifo //fifo 导入 cat
example           //成功输出了example.txt里的数据
[1]+  Done                    cat example.txt > fifo  
[root@server7 ~]# cat < fifo



个人理解:fifo就相当于管道,他只是负载数据导向传送,并不负责存储数据, 因此我们第一次 cat < fifo 显示了数据,第二次就没了,就像水流了不会呆在源地 。

[root@server7 ~]# ll fifo
prw-r--r-- 1 root root 0 Aug  8 12:56 fifo

大小为0,足以为证


接下来是一个shell程序,利用fifo实现了主对从的任务分发

  1.主

#########################################################################                                                                                                
 

 2 # File Name: master.sh
  3 # Author: dty
  4 # mail: [email protected]
  5 # Created Time: Fri 07 Aug 2015 09:04:53 PM CST
  6 #########################################################################
  7 #!/bin/bash
  8 pid=$$ //得到当前脚本的pid
  9 fifo=/tmp/fifo.$pid   //设定pid独一无二的fifo名字,以及路径
 10 log=/tmp/log.$pid //记录操作
 11 > $log //清空文件,保证纯净
 12 echo "my PID is $pid" //输出pid,便于下面从使用
 13 mkfifo $fifo //建立fifo了!
 14 while :
 15 do
 16     echo -en "Give me a command for one of my minions:"
 17     read cmd
 18     echo $cmd > $fifo //把你输入的东西导入到fifo 
 19 done
 20 rm -fr $log $fifo //循环结束删除fifo和记录

 ######################################################################### 

                                                                                              2.从

  2 # File Name: minion.sh
  3 # Author: dty
  4 # mail: [email protected]
  5 # Created Time: Sat 08 Aug 2015 12:06:30 PM CST
  6 #########################################################################
  7 #!/bin/bash
  8 master=$1 //$1需要我们手动输入主脚本里设定的显示出来的pid
  9 fifo=/tmp/fifo.$master //即主的fifo
 10 log=/tmp/log.$master //即主的记录
 11 
 12 while :
 13 do
 14     read cmd args < $fifo    //把主的fifo导入read ,此时 变量 cmd args 就是master上你输入的东西
 15     if [ ! -z "$cmd" ];then //
 16         if [ "$cmd" == "quit" ];then //如果你输入quit了
 17             echo "very good,master."|tee -a $log //就退出,同时往记录里追加very good,master,表示一个从脚本已经退出
 18             exit 0 //退出
 19         fi
 20         echo "`date`:Executing \"${cmd}\" for the master." |tee -a $log //显示你输入的命令
 21         if [ ! -z "$args" ];then //如果你的命令有第二个参数以上
 22             for arg in $args
 23             do
 24                 echo -en "$args" |tee -a $log          //把第二个参数输出出来,然后追加到记录                                                                                                                  
 25                 sleep 1
 26             done

 27             echo | tee -a $log     //输出个空行到记录,容易辨认
 28         fi
 29     fi
 30     sleep 10
 31 done
~

运行脚本 从输入主 的pid建立连接,输入命令,右上角主,右下角记录,左边是从脚本。

如下

linux-shellscript 之mkfifo使用_第1张图片


linux-shellscript 之mkfifo使用_第2张图片







linux-shellscript 之mkfifo使用_第3张图片




linux-shellscript 之mkfifo使用_第4张图片

可见,fifo 主的相当于管道的一端,从是另一端,从而保证了数据在不同脚本之间传输~~




你可能感兴趣的:(linux-shellscript 之mkfifo使用)