我如何构建一个在执行后不会停止 Erlang VM 的 Elixir 脚本(如 elixir --no-halt)
How can I build an Elixir escript that does not halt the Erlang VM after execution (like elixir --no-halt)
我有一个启动应用程序然后将(子)工人添加到主管的程序。显然,仅在这样做之后,它就没有什么可做的了,它会停止(退出)。因此,让它不停止 VM 将允许工作人员工作。
我想到的唯一解决方案是添加:
IO.gets "Working... To finish hit <Enter>."
最后...
我想构建一个 escript
,在 运行 之后不会像这样停止 Erlang VM:
elixir --no-halt -S mix run --eval 'MyApp.CLI.m
ain(["some-arg"])'
或
mix run --no-halt --eval 'MyApp.CLI.m
ain(["some-arg1,some-arg2"])'
有没有办法用 escript 做到这一点?
或者我应该使用不同的解决方案来打包和分发我的程序,它实际上更像 server/daemon 而不是命令行工具?
打包此类系统的典型方法是 OTP 版本。您可以为此使用 exrm。
如果由于某些原因,您仍然想使用escript,您可以在启动所有应用程序和进程后调用:timer.sleep(:infinity)
。
注意:从 Elixir 1.9 开始
我们可以使用System.no_halt(true)
让脚本永不停止。
这是一个简单的脚本示例:
defmodule Mix.Tasks.NoHalt do
use Mix.Task
def run(_) do
System.no_halt(true)
IO.puts("Never die!")
end
end
我有一个启动应用程序然后将(子)工人添加到主管的程序。显然,仅在这样做之后,它就没有什么可做的了,它会停止(退出)。因此,让它不停止 VM 将允许工作人员工作。
我想到的唯一解决方案是添加:
IO.gets "Working... To finish hit <Enter>."
最后...
我想构建一个 escript
,在 运行 之后不会像这样停止 Erlang VM:
elixir --no-halt -S mix run --eval 'MyApp.CLI.m
ain(["some-arg"])'
或
mix run --no-halt --eval 'MyApp.CLI.m
ain(["some-arg1,some-arg2"])'
有没有办法用 escript 做到这一点?
或者我应该使用不同的解决方案来打包和分发我的程序,它实际上更像 server/daemon 而不是命令行工具?
打包此类系统的典型方法是 OTP 版本。您可以为此使用 exrm。
如果由于某些原因,您仍然想使用escript,您可以在启动所有应用程序和进程后调用:timer.sleep(:infinity)
。
注意:从 Elixir 1.9 开始
我们可以使用System.no_halt(true)
让脚本永不停止。
这是一个简单的脚本示例:
defmodule Mix.Tasks.NoHalt do
use Mix.Task
def run(_) do
System.no_halt(true)
IO.puts("Never die!")
end
end