【问题标题】:Elixir receiving data from a system commandElixir 从系统命令接收数据
【发布时间】:2016-10-19 04:22:38
【问题描述】:

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

我知道我应该以某种方式将它分离并开始从中接收,但我不知道如何做到这一点...elixir 对我来说仍然很新。

【问题讨论】:

    标签: elixir


    【解决方案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"
    

    【讨论】:

    • 一如既往...谢谢@Dogbert。你能告诉我^port到底是​​什么意思吗?
    • 这是 Pin 运算符。见elixir-lang.org/getting-started/…。简而言之,该模式只会匹配两个元素元组,其中第一个元素的值等于 port 的值。
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多