Elixir从系统命令接收数据

时间:2016-10-18 19:51:08

标签: elixir

我有这个命令,我希望在elixir(System.cmd("tail", ["-n", "1", "-f", "/var/log/syslog"]))中执行,它应该在每次将日志添加到syslog文件时发送一个新行,但是,就像这样运行,代码只是stales。

我知道我应该以某种方式分离它并开始从中接收但是我没有一个线索如何做到这一点...... elixir对我来说仍然是个新手。

1 个答案:

答案 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"