shahryarjb

shahryarjb

How to send line by line of System.cmd to LiveView when a task is running

Hi friend,
I run 3 or 4 different command with System.cmd, so users wait for these tasks are done and after getting status 0 can do another jobs, but I need a way to show them System.cmd log line by line when is running not show all the log at the end.

System.cmd(operation, [command], into: IO.stream(), stderr_to_stdout: true, env: [{"MIX_ENV", "#{Mix.env()}"}])

And if this feature is available at any time, it will be very attractive. For example, from the middle of the log, if requested, show not the whole log or sending any line to PubSub to the channel.

Thank you

Marked As Solved

ruslandoga

ruslandoga

Try using charlists instead of binaries:

Port.open({:spawn_executable, path}, env: [{'MIX_ENV', 'dev'}])

Also Liked

ruslandoga

ruslandoga

You might be able to do that with Port.open and then receive messages coming from it and send them to the liveview process.

port.exs

defmodule Command do
  def exec(cmd, args) do
    path = System.find_executable(cmd)
    port = Port.open({:spawn_executable, path}, [:binary, :exit_status, args: args, line: 1000])
    loop(port)
  end

  defp loop(port) do
    receive do
      {^port, {:data, data}} ->
        IO.inspect(data: data)
        loop(port)

      {^port, {:exit_status, exit_status}} ->
        IO.inspect(exit_status: exit_status)
    end
  end
end

Command.exec("cat", ["port.exs"])
> elixir port.exs
[data: {:eol, "defmodule Command do"}]
[data: {:eol, "  def exec(cmd, args) do"}]
[data: {:eol, "    path = System.find_executable(cmd)"}]
[
  data: {:eol,
   "    port = Port.open({:spawn_executable, path}, [:binary, :exit_status, args: args, line: 1000])"}
]
[data: {:eol, "    loop(port)"}]
[data: {:eol, "  end"}]
[data: {:eol, ""}]
[data: {:eol, "  defp loop(port) do"}]
[data: {:eol, "    receive do"}]
[data: {:eol, "      {^port, {:data, data}} ->"}]
[data: {:eol, "        IO.inspect(data: data)"}]
[data: {:eol, "        loop(port)"}]
[data: {:eol, ""}]
[data: {:eol, "      {^port, {:exit_status, exit_status}} ->"}]
[data: {:eol, "        IO.inspect(exit_status: exit_status)"}]
[data: {:eol, "    end"}]
[data: {:eol, "  end"}]
[data: {:eol, "end"}]
[data: {:eol, ""}]
[data: {:eol, "Command.exec(\"cat\", [\"port.exs\"])"}]
[exit_status: 0]
ruslandoga

ruslandoga

axelson

axelson

Scenic Core Team

I’d recommend looking into exexec | Hex (which wraps the erlexec Erlang library) especially if the command you want to run are not written to conform to the behavior that Port expects.

ruslandoga

ruslandoga

Port.open({:spawn_executable, path}, env: [{'MIX_ENV', 'dev'}])

Note that Mix.env() is not always available at runtime.

Where Next?

Popular in Questions Top

vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
Werner
Hi, I’m using Ubuntu 18.04 and after updating to OTP-24.0 yesterday i have this warning when I run “mix local.hex”: 14:57:30.512 [warn] ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
Codball
Mix format works fine if run from the cmd. I’ve followed this to facilitate the implementation into VSC which involves downloading an ext...
New
Mooodi
Given a string, how can I get access to its character by index? Enum.at("my_string", 2) doesn't work. Or rather, not char, but a substr...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

Other popular topics Top

dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
William
I would like to know that is there any online source for learning Phoenix Framework for building E-Commerce Store? Any advantage on build...
New
malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 27727 240
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
AstonJ
by Lance Halvorsen Elixir and Phoenix are generating tremendous excitement as an unbeatable platform for building modern web application...
460 27162 124
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement