在bash中通过文件处理通信
我正在编写bash脚本,希望使用write-to-file在两个进程之间建立通信。该计划的演练将包括:在bash中通过文件处理通信,bash,interprocess,Bash,Interprocess,我正在编写bash脚本,希望使用write-to-file在两个进程之间建立通信。该计划的演练将包括: 进程1打开文件“file.txt”,并在终端中写入用户指定的一些输入 进程2从另一端打开同一个文件,并不断读取该文件以进行更新 如果进程2发现更新,它将向用户显示输出 目前,我一直在确定文件何时更新,并将文件的更新部分(在本例中是最后一行)存储在变量中 任何帮助都将不胜感激 注意:假设两个过程脚本位于同一位置,并在不同的终端上运行 更新 正如一些人建议使用命名管道,其中textfile是管道。
正如一些人建议使用命名管道,其中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-我尝试了管道,但它并不能真正满足我的需要。请看问题的更新。效果很好!我想在另一个进程上向终端回显更新的行。看看我最后写的代码的答案。效果很好!我想在另一个进程上向终端回显更新的行。查看我的答案,了解我最终编写的代码。