通过 bash 中的文件处理通信

Process communication through file in bash

我正在编写 bash 脚本并希望使用写入文件设置两个进程之间的通信。该程序的演练将是:

  1. 进程 1 打开文件 "file.txt" 并在终端中写入用户指定的一些输入
  2. 进程 2 从另一端打开相同的文件并不断读取它以进行更新。
  3. 如果进程 2 找到更新,它会向用户显示输出。

目前我无法确定文件何时更新并将文件的更新部分(在本例中为最后一行)存储在变量中。

任何帮助将不胜感激!

P.S。假设两个进程脚本都在同一位置,并且在不同的终端上 运行。

更新

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

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

mkfifo file.txt

参见,例如,这个短片 tutorial

简而言之,创建管道后,第一个进程将其写入,就好像它是一个 "normal" 文件一样。第二个进程执行的任何读取都会阻塞,直到有新的 "content" 可用。

像这样:

进程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 命令解决了我的问题。