2016-10-18 2 views
0

나는이 명령을 syslog 파일에 로그가 추가 될 때마다 줄 바꿈을 보내도록되어있는 엘릭서 (System.cmd("tail", ["-n", "1", "-f", "/var/log/syslog"]))로 실행하고 싶지만, 그 코드는 단지 썩어 빠져있다.시스템 명령에서 데이터를받는 엘릭서

나는 그것을 어떻게 든 떼어 내고 그것으로부터받는 것을 시작해야한다는 것을 안다.하지만 나는 그걸 어떻게해야하는지 단 하나의 단서가 없다. ... 연금술은 나에게 여전히 정말로 새로운 것이다.

답변

1

System.cmd을 사용하면 가능하지 않겠지 만 Port.open/2을 사용할 수 있습니다. 여기에 입력을받을 수 receive을 사용하고 백그라운드에서 프로세스를 생성하고하는 방법은, 가능한 경우 :

$ echo 1 >> a.txt 
$ echo 2 >> a.txt 
$ echo 3 >> a.txt 
$ seq 4 10 >> a.txt 

프로그램이 인쇄 :

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 

별도의 쉘에서, 나는 이것을 실행 :

"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'의 값과 같은 두 개의 요소 튜플과 일치 할 것입니다. – Dogbert

관련 문제