我有这个命令,我希望在elixir(System.cmd("tail", ["-n", "1", "-f", "/var/log/syslog"])
)中执行,它应该在每次将日志添加到syslog
文件时发送一个新行,但是,就像这样运行,代码只是stales。
我知道我应该以某种方式分离它并开始从中接收但是我没有一个线索如何做到这一点...... elixir对我来说仍然是个新手。
答案 0 :(得分:1)
我认为使用System.cmd
可以实现这一点,但您可以使用Port.open/2
。以下是如何在后台生成流程,然后使用receive
接收其输入,只要可用:
defmodule Main do
def main do
port = Port.open({:spawn, "tail -n 1 -f a.txt"}, [:binary])
loop(port)
end
def loop(port) do
receive do
{^port, {:data, data}} ->
IO.inspect data
loop(port)
end
end
end
Main.main
在一个单独的shell中,我运行了这个:
$ echo 1 >> a.txt
$ echo 2 >> a.txt
$ echo 3 >> a.txt
$ seq 4 10 >> a.txt
并且程序打印了这个:
"1\n"
"2\n"
"3\n"
"4\n5\n6\n7\n8\n9\n10\n"