如何在elixir的远程机器上以编程方式“Hello World”?

时间:2017-09-08 17:40:13

标签: erlang elixir

目标:在远程计算机上打印“hello world”。

我想从我的计算机中生成一个进程并在远程计算机上打印“Hello World”(调用Sample.hello)。有些方法可以像上面提到的here那样连接不同机器上的节点。但这是使用iex命令。 如何在远程计算机上打印“Hello World”以编程方式

defmodule Sample do


  def hello do
    IO.puts "Hello World"
  end

  def main(args \\ []) do

    # IP address of remote server from command line argument.

    {_, input, _} = OptionParser.parse(args, switches: [])
    ipaddress = List.to_string(input)

    """
      1. spawn new process
      2. print hello world on remote machine - Call Sample.hello
    """
  end
end

3 个答案:

答案 0 :(得分:1)

在REMOTE机器上启动VM

cron job

在LOCAL计算机上启动VM

$ iex --sname "node@192.168.0.202" --cookie mycookie

在当地的灵药终端

$ iex --sname "node@192.168.0.201" --cookie mycookie

您已经编译了源

Node.connect :"node@192.168.0.202"
Main.main(  :"node@192.168.0.202" )

我没有运行此功能但只要您自定义IP地址/名称就可以运行

答案 1 :(得分:0)

有多种方法可以做到这一点。这是一个例子。

远程设置

mix new foo

编辑foo/lib/foo.ex如下所示:

defmodule Foo do
  def connect do
    Node.start(:foo@foohostname, :shortnames)
    Node.set_cookie(:foo@foohostname, :shh_dont_tell)
  end

  def hello do
    IO.puts :world
  end
end

请确保将主机名放在本地网络中,以代替foohostname

接下来,启动它。您提到要避免使用iex,因此可以根据需要启动应用程序。例如,您可以创建一个混合脚本来启动它并进行连接。但是,由于这与当前主题背道而驰,因此我将从iex开始:

iex -S mix

其次:

iex(1)> Foo.connect

本地设置

mix new bar

bar/lib/bar.ex中:

defmodule Bar do
  def connect do
    Node.start(:bar@barhostname, :shortnames)
    Node.set_cookie(:bar@barhostname, :shh_dont_tell)
    Node.connect(:foo@foohostname)
  end
end

请记住将bar的主机名替换为barhostname,同样将foo替换为。

现在,您可以通过编程方式连接节点。您可以在Bar应用程序中的任何位置访问另一个Foo节点。

让我们再次使用iex作为示例。按照命令行进行操作:

iex -S mix

iex(1)> Bar.connect
#PID<16393.795.0>
iex(bar@barhostname)> Node.spawn_link :foo@foohostname, fn -> Foo.hello end
world
#PID<16393.795.0>

请注意,连接节点对于生成这样的一次性函数调用不是必需的,因此在此示例中,您可以选择不包括Node.connect行,但是对于更复杂的节点管理来说是必需的。 / p>

答案 2 :(得分:-1)

@GavinBrelstaff答案还可以,但可以简化为:

在一个终端:

TO_CHAR (DATEID,'DD/MM/YYYY') = TO_CHAR (GETDATE()-1,'DD/MM/YYYY')

在另一个终端:

$ iex --sname node1@localhost

您可以看到该功能已在node1上运行。请注意,IO.puts输出被重定向到node2上的控制台,因此它不会在node1上打印出来(这可能是您混淆的根源?)。