【发布时间】:2016-10-19 04:22:38
【问题描述】:
我有一个希望在 elixir (System.cmd("tail", ["-n", "1", "-f", "/var/log/syslog"])) 中执行的命令,它应该在每次将日志添加到 syslog 文件时发送一个新行但是,就像这样运行,代码只是陈旧。
我知道我应该以某种方式将它分离并开始从中接收,但我不知道如何做到这一点...elixir 对我来说仍然很新。
【问题讨论】:
标签: elixir
我有一个希望在 elixir (System.cmd("tail", ["-n", "1", "-f", "/var/log/syslog"])) 中执行的命令,它应该在每次将日志添加到 syslog 文件时发送一个新行但是,就像这样运行,代码只是陈旧。
我知道我应该以某种方式将它分离并开始从中接收,但我不知道如何做到这一点...elixir 对我来说仍然很新。
【问题讨论】:
标签: elixir
我认为使用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"
【讨论】:
^port到底是什么意思吗?
port 的值。