2016-10-18 16 views
0

このコマンドは、syslogファイルにログを追加するたびに新しい行を送信する予定のエリクシル(System.cmd("tail", ["-n", "1", "-f", "/var/log/syslog"]))で実行したいが、コードはただ嫌です。システムコマンドからデータを受け取るエリクサー

私は何とかそれを切り離してそれから受信を開始するはずですが、私はそれを行う方法を単一の手掛かりを持っていない...エリクサーはまだ私には本当に新しいです。

答えて

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 

別のシェルでは、私はこれを実行しました:

$ 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" 
+0

いつも...ありがとう@Dogbert。 '^ port 'とはどういう意味ですか? –

+0

ピンオペレーターです。 http://elixir-lang.org/getting-started/pattern-matching.html#the-pin-operatorを参照してください。要するに、そのパターンは、最初のものが 'port'の値と等しい2つの要素タプルにのみマッチします。 – Dogbert

関連する問題