目标:在远程计算机上打印“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
答案 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上打印出来(这可能是您混淆的根源?)。