Nicd

Nicd

Port.open EACCES on Windows

I’m using Port.open to execute some npm tools. This works fine on macOS and Linux but fails on Windows with the following reason:

* (ErlangError) erlang error: :eacces
    erlang.erl:2080: :erlang.open_port({:spawn_executable, "/path/to/node_modules/.bin/concisecss.cmd"}, [:exit_status, :stderr_to_stdout, {:args, ["compile"]}, {:line, 1024}])

I can execute concisecss.cmd normally by opening it with Explorer, and I have checked that I have execute permission for it (this happens for every npm program, concise is here just as an example). Is it because it is a bat script? How should I run it on Windows?

Marked As Solved

Nicd

Nicd

Answering myself here with the solution. The problem was that cmd scripts can’t be spawned as executables on Windows, so I had to use cmd.exe. I looked at the :os.cmd sources to see how Erlang does it and found the winning combination.

In the end, the answer was to use cmd.exe /c foo.cmd, but with a Windows-specific flag :hide to the Port opening call. That hides the opened cmd window and sends stdout correctly. Without the flag, the cmd window flashes on the screen and stdout never arrives back to BEAM.

Here is the solution used in the end:

Port.open({:spawn_executable, "c:/windows/system32/cmd.exe"}, [:exit_status, :stderr_to_stdout, :hide, line: 1024, args: ["/c", "c:/path/to/node_modules/.bin/concisecss.cmd"]])

Also Liked

Nicd

Nicd

Yeah, I only found it by looking at how :os.cmd was implemented in the Erlang source. Later on I discovered it’s documented in the Erlang docs as:

When running on Windows, suppresses creation of a new console window when spawning the port program. (This option has no effect on other platforms.)

NobbZ

NobbZ

I can’t try it, but I think, you have to try to spawn it throuch cmd.exe or powershell.exe or whatever interpreter you need. Windows does not know about a concept similar to UNIX’ shebang, but has only some crippled system do determine such stuff by looking at the files ending. But this behaviour isn’t available for tools outside of windows “core” without hooping some loops.

NobbZ

NobbZ

Google says that cmd /c foo.cmd should run foo.cmd without spawning a new window.

Buf as far as I can remember from my erlang things I did, you will loose the access to the spawned programs stdin and -out, which is probably the mainreason for using a Port

Where Next?

Popular in Questions Top

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
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: The documentation above suggests that while ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
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
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New

Other popular topics Top

AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39523 209
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52774 488
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
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
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
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
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement