如何构建执行后不会停止Erlang VM的Elixir脚本(如Elixir--no-halt)
我有一个程序,启动应用程序,然后向主管添加(儿童)工人。显然,在仅仅这样做之后,它就没有更多的事情要做了,它停止(退出)。因此,让它不停止虚拟机将允许工人工作 我提出的唯一解决方案是添加:如何构建执行后不会停止Erlang VM的Elixir脚本(如Elixir--no-halt),erlang,elixir,erlang-escript,Erlang,Elixir,Erlang Escript,我有一个程序,启动应用程序,然后向主管添加(儿童)工人。显然,在仅仅这样做之后,它就没有更多的事情要做了,它停止(退出)。因此,让它不停止虚拟机将允许工人工作 我提出的唯一解决方案是添加: IO.gets "Working... To finish hit <Enter>." 或 有没有办法用escript做到这一点 或者我应该使用不同的解决方案来打包和分发我的程序,实际上它更像是一个服务器/守护进程,而不是一个命令行工具?打包此类系统的典型方法是OTP版本。你可以用它 如果出于某
IO.gets "Working... To finish hit <Enter>."
或
有没有办法用escript做到这一点
或者我应该使用不同的解决方案来打包和分发我的程序,实际上它更像是一个服务器/守护进程,而不是一个命令行工具?打包此类系统的典型方法是OTP版本。你可以用它
如果出于某些原因,您仍然希望使用escript,那么在启动所有应用程序和进程后,只需调用
:timer.sleep(:infinity)
。注意:从Elixir 1.9开始
我们可以使用来允许脚本永不停止
下面是一个简单的脚本示例:
defmodule Mix.Tasks.NoHalt do
使用Mix.Task
def run(ux)do
系统。无停止(真)
IO.puts(“不死!”)
结束
结束
sleep解决方案看起来比gets
更好。非常感谢。您认为能够将--no-halt
(以及--distached
或任何其他选项)传递给在escript中运行程序的elixir命令有意义/有用吗?正如我所说,我认为在这种情况下使用OTP版本更为惯用。我不确定--no-halt
是否可以使用escripts,因为使用escripts,Erlang VM只运行主代码,然后停止。好吧,所有参数都直接传递给脚本,所以我看不到一种干净的方法来进行参数预处理。同样,您应该真正考虑使用OTP版本来处理您的情况。通过“在EsScript中运行程序的ILIXIR命令传递选项”,我的意思是在EsScript的编译/编译时进行。当然,我会签出OTP发行版,但我也有一种感觉,可以选择编译带有——no halt
等标志的escript,这可能很有用。我能想到的唯一方法是在生成的脚本中插入计时器睡眠调用。这是一件你自己也可以轻松做到的事情,所以我个人不认为有什么特别的好处。但也许你应该考虑在长石核上讨论这个问题,以获得别人的意见。
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"])'