在bash中通过文件处理通信

在bash中通过文件处理通信,bash,interprocess,Bash,Interprocess,我正在编写bash脚本,希望使用write-to-file在两个进程之间建立通信。该计划的演练将包括: 进程1打开文件“file.txt”,并在终端中写入用户指定的一些输入 进程2从另一端打开同一个文件,并不断读取该文件以进行更新 如果进程2发现更新,它将向用户显示输出 目前,我一直在确定文件何时更新,并将文件的更新部分(在本例中是最后一行)存储在变量中 任何帮助都将不胜感激 注意:假设两个过程脚本位于同一位置,并在不同的终端上运行 更新 正如一些人建议使用命名管道,其中textfile是管道。

我正在编写bash脚本,希望使用write-to-file在两个进程之间建立通信。该计划的演练将包括:

  • 进程1打开文件“file.txt”,并在终端中写入用户指定的一些输入
  • 进程2从另一端打开同一个文件,并不断读取该文件以进行更新
  • 如果进程2发现更新,它将向用户显示输出
  • 目前,我一直在确定文件何时更新,并将文件的更新部分(在本例中是最后一行)存储在变量中

    任何帮助都将不胜感激

    注意:假设两个过程脚本位于同一位置,并在不同的终端上运行

    更新


    正如一些人建议使用命名管道,其中textfile是管道。我在共享文件系统的集群上运行进程,这些进程可以位于任意两个节点上。因此,进程1发送的命令将写入文件,并由进程2在不同节点上读取。另一方面,命名管道要求两个进程都存储在本地

    如上所述,最简单的方法可能是创建命名管道,例如

    mkfifo file.txt
    
    参见,例如,本短片


    松散地说,创建管道后,第一个进程将其写入,就好像它是一个“普通”文件一样。第二个进程执行的任何读取都会被阻止,直到有新的“内容”可用。

    如上所述,最简单的方法可能是创建命名管道,例如

    mkfifo file.txt
    
    参见,例如,本短片

    松散地说,创建管道后,第一个进程将其写入,就好像它是一个“普通”文件一样。第二个进程执行的任何读取都会被阻止,直到有新的“内容”可用。

    类似于以下内容:

    过程1

    #!/bin/bash
    while :; do
        seq 1 100 >> sharedFile.txt
        sleep 3
    done
    
    过程2

    tail -f sharedFile.txt | awk '/^53/{print "Saw 53"}'
    
    或者,如果
    process2
    在看到某些内容时需要运行某些命令:

    tail -f sharedFile.txt | awk '/^53/{system("beep")}'
    
    大概是这样的:

    过程1

    #!/bin/bash
    while :; do
        seq 1 100 >> sharedFile.txt
        sleep 3
    done
    
    过程2

    tail -f sharedFile.txt | awk '/^53/{print "Saw 53"}'
    
    或者,如果
    process2
    在看到某些内容时需要运行某些命令:

    tail -f sharedFile.txt | awk '/^53/{system("beep")}'
    

    我能够用以下代码解决问题:

    进程2读取文件以获取更新:

    filename="testfile.txt"
    tail -n 0 -F $filename | \
    while read LINE
    do
    echo "$LINE"
    done
    
    进程1使用简单的
    >>


    tail
    命令解决了我的问题。

    我能够用以下代码解决问题:

    进程2读取文件以获取更新:

    filename="testfile.txt"
    tail -n 0 -F $filename | \
    while read LINE
    do
    echo "$LINE"
    done
    
    进程1使用简单的
    >>



    tail
    命令解决了我的问题。

    为什么不使用命名管道而不是普通文件?可以使用未命名管道吗
    proc1 | proc2
    ?仅当两个进程位于同一台机器上时,命名管道才起作用。我在一个集群上运行代码,节点可以在任何地方。命名管道实际上不起作用。让
    process2
    在文件上运行
    tail-f
    ,然后用
    --line buffered
    对该文件的输出进行grep,或者用
    awk
    读取并使用
    system()
    处理它找到的东西。@MarkSetchell一些代码可能有助于说明您的观点。为什么不使用命名管道而不是普通文件?可以使用未命名管道吗
    proc1 | proc2
    ?仅当两个进程位于同一台机器上时,命名管道才起作用。我在一个集群上运行代码,节点可以在任何地方。命名管道实际上不起作用。让
    process2
    在文件上运行
    tail-f
    ,然后用
    --line buffered
    对该文件的输出进行grep,或者用
    awk
    读取并使用
    system()
    用它找到的东西做点什么。@MarkSetchell一些代码可能有助于说明你的观点。谢谢你给我指点管道。向上投票,以便随附教程。但是,我希望重用此文件并读取稍后编写的数据内容。似乎即使在我关闭进程之后,我也无法读取文件,我无法在任何文本编辑器中打开它。管道本身并不存储数据,它只是作为“通信通道”工作,您可以在其中一个进程中创建数据的副本供以后使用,也可以使用某种同步技术,例如
    lockfile
    和friends-我尝试了管道,但它并不能真正满足我的需要。请看问题的更新。谢谢你给我指点管道。向上投票,以便随附教程。但是,我希望重用此文件并读取稍后编写的数据内容。似乎即使在我关闭进程之后,我也无法读取文件,我无法在任何文本编辑器中打开它。管道本身并不存储数据,它只是作为“通信通道”工作,您可以在其中一个进程中创建数据的副本供以后使用,也可以使用某种同步技术,例如
    lockfile
    和friends-我尝试了管道,但它并不能真正满足我的需要。请看问题的更新。效果很好!我想在另一个进程上向终端回显更新的行。看看我最后写的代码的答案。效果很好!我想在另一个进程上向终端回显更新的行。查看我的答案,了解我最终编写的代码。