log_monitor/apps/log_monitor/src/watcher.erl

21 lines
616 B
Erlang

-module(watcher).
-compile(export_all).
start(MonitorPid, File) ->
spawn_link(?MODULE, init, [MonitorPid, File]).
init(MonitorPid, File) ->
Cmd = "/usr/bin/tail -n0 --follow=name " ++ File,
Port = open_port({spawn, Cmd}, [stderr_to_stdout, exit_status, binary]),
loop(MonitorPid, Port).
loop(MonitorPid, Port) ->
receive
{Port, {data, {eol, Bin}}} ->
Text = binary_to_list(iolist_to_binary(Bin)),
MonitorPid ! {log_line, Text},
loop(MonitorPid, Port);
{Port, {exit_status, _Status}} ->
io:format("Watcher terminated~n")
end.