axelson

axelson

Scenic Core Team

Unable to run erlexec in a escript

I’m trying to run erlexec in an escript. It seems like it should be possible, but since erlexec depends on a priv directory by default, (which isn’t supported by escripts) I just need to configure it to point to a different port executable. I should be able to pass a {:portexe, executable_path option, but I’m not sure where to put that configuration because the startup of erlexec happens automatically on since on application boot by Elixir.

Here’s a test repository: GitHub - axelson/erlexec_escript_example: Demonstrate issue with erlexec escript · GitHub
Just run:

mix deps.get
mix escript.build
./erl_exec_test

And you should see an error message like:

22:15:12.827 [warn]  Priv directory not available

22:15:12.834 [info]  Application erlexec exited: :exec_app.start(:normal, []) returned an error: shutdown: failed to start child: :exec
    ** (EXIT) bad return value: 'Cannot find file : no such file or directory'
Could not start application erlexec: :exec_app.start(:normal, []) returned an error: shutdown: failed to start child: :exec
    ** (EXIT) bad return value: 'Cannot find file : no such file or directory'

Relevant links:

Can anyone point me in the right direction?

Marked As Solved

josevalim

josevalim

Creator of Elixir

My suggestion would be to include the binary inside the escript (you can read it, put it in a module attribute and put it in a function) and then write it down to the user temporary directory. You can delay the start of erlexec by setting it to runtime: false in your mix.exs.

Also Liked

axelson

axelson

Scenic Core Team

Okay, based on your instructions I’ve created a little helper module that copies the exec-port binary into the systems temp folder and it is currently working well:

defmodule ErlexecInit do
  @moduledoc """
  Responsible for starting Erlexec in a manner compatible with escripts. By
  default the exec-port binary is compiled into erlexec's priv folder, but since
  escripts don't have access to the priv directories we need to store the binary
  into the code and then on startup we need to write it out into the system's
  tempdirectory

  Reference: https://forum.elixirforum.com/t/unable-to-run-erlexec-in-a-escript/21603
  """

  use GenServer

  @exec_port_binary_path Application.app_dir(:erlexec, [
                           "priv",
                           :erlang.system_info(:system_architecture),
                           "exec-port"
                         ])

  @execport_binary File.read!(@exec_port_binary_path)

  def start_link(_, name \\ __MODULE__) do
    GenServer.start_link(__MODULE__, nil, name: name)
  end

  @impl GenServer
  def init(_) do
    port_exe_path =
      System.tmp_dir!()
      |> Path.join("tmp-exec-port-#{System.unique_integer([:positive])}")
      |> String.to_charlist()

    File.write!(port_exe_path, @execport_binary)
    File.chmod!(port_exe_path, 0o700)

    :exec.start(portexe: port_exe_path)

    {:ok, []}
  end
end
axelson

axelson

Scenic Core Team

I haven’t looked at this code in a while but I think you’re referring to this part of the snippet above:

:exec.start(portexe: port_exe_path)

I’m calling that function in a GenServer that is part of my supervision tree but you would likely also be okay if you dropped that code directly into your application.ex file in the start/2 function.

Here’s the full code if you want to take a look ls_proxy/ls_proxy/lib/erlexec_init.ex at 2435d956f924813021493a9b292f81b81a7eb00d · axelson/ls_proxy · GitHub

JeremyWildsmith

JeremyWildsmith

axelson, thanks for your quick response.

That did indeed work, I misunderstood the purpose of that line of code, but it makes sense now.

Best Regards,

Where Next?

Popular in Questions Top

siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
tduccuong
Hi, is there any work on GUI with Elixir, that is similar to Electron/Javascript? My idea is to bundle Phoenix and BEAM into a single se...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lists...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
JulienCorb
I am trying to implement my new.html.eex file to create new posts on my website. new.html.eex: <h1>Create Post</h1> <%= ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

Other popular topics Top

siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 41989 114
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
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
AstonJ
Seen any cool LiveView demos, sample apps or examples? Please post them here! :003:
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
svb
Hi! Currently I want to submit a form by pressing the Enter key. However, since my input field is of type “textarea” this is just adds a...
New

We're in Beta

About us Mission Statement