[Erlang 0033] 接入Erlang控制台的几种方法
来源:互联网 发布:汽车数据发动机数据 编辑:程序博客网 时间:2024/06/04 18:23
在window中调试的时候我们可以通过启动多个cmd窗口运行Erlang节点,在生产环境中我们需要Erlang服务在Centos服务器上后台运行;这就需要在启动的时候添加启动参数detached来脱离终端:
-detached Starts 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).我们启动两个节点来完成这个操作;
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.168.1.123)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
--> r'node_1@192.168.1.123' %尝试连接到node_1@192.168.1.123
--> j
1 {shell,start,[init]} %列出所有的Job
2* {'node_1@192.168.1.123',shell,start,[]}
--> c 2 %这里2是job的编号,切换到job 2
Eshell V5.9 (abort with ^G)
(node_1@192.168.1.123)1> node(). %注意提示符,现在已经是在node_1
'node_1@192.168.1.123'
(node_1@192.168.1.123)2> erlang:now().
{1326,801888,347570}
(node_1@192.168.1.123)3> %再一次Ctrl + G
User switch command
--> j
1 {shell,start,[init]}
2* {'node_1@192.168.1.123',shell,start,[]}
--> c 1 %切换到job 1
(node_2@192.168.1.123)2> node(). %注意提示符,我们已经回到了node_2
'node_2@192.168.1.123'
(node_2@192.168.1.123)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 by mryufeng
按照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
原理见下图:
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}
- [Erlang 0033] 接入Erlang控制台的几种方法
- 接入Erlang控制台的几种方法
- Erlang Shell JCL 远程进入 接入Erlang控制台的几种方法
- 另一种实用的接入erlang控制台的方法
- 另一种实用的接入erlang控制台的方法
- [Erlang]多种方法接入远程shell控制台
- erlang 多种方法接入远程shell控制台
- erlang 接入远程shell控制台
- erlang程序运行的几种方式
- Erlang,优秀的Erlang
- Erlang gen_server实现定时器(interval)的几种方法及各自的优缺点?
- [Erlang09]Erlang gen_server实现定时器(interval)的几种方法及各自的优缺点?
- 让 Erlang 的控制台支持中文
- erlang控制台命令收集
- 简单谈谈Erlang的几种运算符
- [Erlang]节点通讯的几种形式及问题分析
- Erlang
- Erlang
- [Erlang 0028] Erlang atom
- [Erlang 0029] Erlang Inline编译
- [Erlang 0030] 理解Erlang/OTP Supervisor
- [Erlang 0031] Erlang Shell中的输出完整数据
- [Erlang 0032] Erlang Binary的内部实现
- [Erlang 0033] 接入Erlang控制台的几种方法
- [Erlang 0034] Erlang iolist
- [Erlang 0035] Erlang SMP
- [Erlang 0036] "HOW TO"不创建崩溃报告主动销毁gen_server进程
- [Erlang 0037] Erlang Parameterized Module
- [Erlang 0038] Node.js & Erlang
- [Erlang 0039] Erlang Inheritance
- [Erlang 0040] Hidden Features of Erlang
- [Erlang 0041] 详解io:format