http://www.jb51.cc/article/p-sdacdnbb-bcz.html
Executing: /home/erl/lib/erlang/erts-5.10.3/bin/beam /home/erl/lib/erlang/erts-5.10.3/bin/beam -- -root /home/erl/lib/erlang -progname erl -- -home /root -- -noshell -noinput
作业(JCL)模式
# erl -name
2@127.0.0.1-setcookie 123456
Erlang R16B02 (erts-5.10.3) [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false] Eshell V5.10.3 (abort with ^G) ( 2@127.0.0.1)1> User switch command --> h c [nn] - connect to job i [nn] - interrupt job k [nn] - kill job j - list all jobs s [shell] - start local shell r [node [shell]] - start remote shell q - quit erlang ? | h - this message --> r '1@127.0.0.1' --> j 1 {shell,start,[init]} 2* {' 1@127.0.0.1',shell,[]} --> c 2 Eshell V5.10.3 (abort with ^G) ( 1@127.0.0.1)1> |
( 1@127.0.0.1)1>
User switch command
--> q
Remsh 模式
( 1@127.0.0.1)1> node().
' 1@127.0.0.1'
[Erlang 0033] 接入Erlang控制台的几种方法
在window中调试的时候我们可以通过启动多个cmd窗口运行Erlang节点,在生产环境中我们需要Erlang服务在Centos服务器上后台运行;这就需要在启动的时候添加启动参数detached来脱离终端:
-detachedStarts the Erlang runtime system detached from the system console. Useful for running daemons and backgrounds processes. Implies -noinput.
对于我们自己的服务,即使部署到了生产环境一定要做到"像魔术师的飞刀,出手但并没有脱手",还是需要一些方式进入到Erlang后台进程来做一些工作比如:查看某一个Erlang节点的运行时信息(内存,进程数等),让服务优雅的退出而不是kill进程,或者做一下热更新(参见:[Erlang 0010] Erlang 热更新当然热更新可以使用reloader.erl的方案来简化);一开始的时候服务器比较少,我们采用的是JCL的方式去处理的;
Erlang Shell JCL
JCL是Erlang Shell的一种运行模式,即Job Control Mode (JCL,in which jobs can be started,killed,detached and connected).我们启动两个节点来完成这个操作;
2012-11-14新增备注:下面的实验是在Linux下完成的,Windows下JCL需要启动werl.exe
Node_1添加了-detached选项,启动之后直接在后台运行并没有启动Shell
erl -setcookie abc -name node_1@192.168.1.123 -detached
Node_2使用了和Node_1相同的cookie,启动之后进入Erlang Shell界面
erl -setcookie abc -name node_2@192.168.1.123
下面我们开始在node_2@192.168.1.123演练JCL:
Eshell V5.9 (abort with ^G) (node_2@192.168.1.123)1> node(). %当前这是在node_2 'node_2@192.168.1.123' (node_2@192.2> %Ctrl + G 进入JCL模式 User switch command --> h c [nn] - connect to job i [nn] - interrupt job k [nn] - kill job j - list all jobs s [shell] - start local shell r [node [shell]] - start remote shell q - quit erlang ? | h - this message --> rnode_1@192.168.1.123' %尝试连接到node_1@192.123 --> j 1 {shell,[init]} %列出所有的Job 2* {',[]} --> c 2 %这里2是job的编号,切换到job 2 Eshell V5.9 (abort with ^G) (node_1@192.1> node(). %注意提示符,现在已经是在node_1 ' (node_1@192.2> erlang:now(). {1326,801888,128); line-height:1.5!important">347570} (node_1@192.3> %再一次Ctrl + G User switch command --> j 1 %切换到job 1 (node_2@192.2> node(). %注意提示符,我们已经回到了node_2 3>
这样来来回回切换是不是有点盗梦空间的意思?是不是可以更简单一点,比如直接进入node_1呢?借助-remsh参数就可以做到
看看-remsh的说明恰好是我们需要的:
If you want an Erlang node to have a remote job active from the start (rather than the default local job),you start Erlang with the -remsh flag. Example: erl -sname this_node -remsh other_node@other_host
动手试一下:
erl -setcookie abc -name node_3@192.168.1.123 -remsh node_1@192.168.1.123 %%这样就直接进入了node_1节点
注意:直接进入到了node_1,执行完操作了想要退出怎么办?你要是在这里执行一下q(). node_1这个节点就直接死掉了;
正确的方法还是Ctrl+G进入JCL模式然后执行q命令退出;使用ps aux|grep node查看一下进程是不是还在
ejabberd网站上提到了这个方法
[1] Attach an Erlang Shell to an Already Running ejabberd Process http://www.ejabberd.im/tricks
[2] Interconnecting Erlang Nodes http://www.ejabberd.im/interconnect-erl-nodes
另一种实用的接入erlang控制台的方法
地址:http://mryufeng.iteye.com/blog/362394 Powered bymryufeng
按照mryufeng老大的方法操练了一番,成功,中间 /usr/local/lib/erlang/bin/start 启动失败,同样是目录和配置文件缺失的问题
mkdir /usr/local/lib/erlang/log
echo "[]." > /usr/local/lib/erlang/releases/R15B/sys.config
Stackoverflow的相关问题: How to create deamon program with erlang? http://stackoverflow.com/questions/5972811/how-to-create-deamon-program-with-erlang
题外话:在embedded模式下是没有交互式shell可用的,能够接入Erlang VM的方法就是to_erl
原理见下图:
erl_call
Usage: /usr/local/lib/erlang/lib/erl_interface-3.7.6/bin/erl_call [-[demqrsv]] [-c Cookie] [-h HiddenName]
[-x ErlScript] [-a [Mod [Fun [Args]]]]
(-n Node | -sname Node | -name Node)
where: -a apply(Mod,Fun,Args) (e.g -a 'erlang length [[a,b,c]]'
-c cookie string; by default read from ~/.erlang.cookie
-d direct Erlang output to ~/.erl_call.out.<Nodename>
-e evaluate contents of standard input (e.g echo "X=1,Y=2,{X,Y}."|erl_call -e ...)
-h specify a name for the erl_call client node
-m read and compile Erlang module from stdin
-n name of Erlang node,same as -name
-name name of Erlang node,expanded to a fully qualified
-sname name of Erlang node,short form will be used
-q halt the Erlang node (overrides the -s switch)
-r use a random name for the erl_call client node
-s start a new Erlang node if necessary
-v verbose mode,i.e print some information on stderr
-x use specified erl start script,default is erl
B=2,
C=A+B.
%Ctrl + D
{ok,3}
SSH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ mkdir /tmp/ssh
$ ssh-keygen -t rsa -f /tmp/ssh/ssh_host_rsa_key
$ ssh-keygen -t rsa1 -f /tmp/ssh/ssh_host_key
$ ssh-keygen -t dsa -f /tmp/ssh/ssh_host_dsa_key
$ erl
1> application:ensure_all_started(ssh).
{ok,[crypto,asn1,public_key,ssh]}
2> ssh:daemon(8989,[{system_dir,
"/tmp/ssh"
},
2> {user_dir,monospace!important; min-height:auto!important; color:blue!important">"/home/ferd/.ssh"
}]).
$ ssh -p 8989 ferd@127.0.0.1
Eshell Vx.x.x (abort with ^G)
1>
|