通过 bash 中的文件处理通信
Process communication through file in bash
我正在编写 bash 脚本并希望使用写入文件设置两个进程之间的通信。该程序的演练将是:
- 进程 1 打开文件 "file.txt" 并在终端中写入用户指定的一些输入
- 进程 2 从另一端打开相同的文件并不断读取它以进行更新。
- 如果进程 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
命令解决了我的问题。
我正在编写 bash 脚本并希望使用写入文件设置两个进程之间的通信。该程序的演练将是:
- 进程 1 打开文件 "file.txt" 并在终端中写入用户指定的一些输入
- 进程 2 从另一端打开相同的文件并不断读取它以进行更新。
- 如果进程 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
命令解决了我的问题。