前言

今天重启了服务器,发现supervisor管理的rabbitmq的进程居然启动失败了,查看日志发现老是报错,记录一下解决的办法。

报错:erlexec:HOME must be set

  • 找了网上的许多人的博客,一般的说法是在进程的启动的脚本中加入:
export HOME=/usr/local/erlang
export PATH=$PATH:$HOME/bin
  • 系统默认的HONE是/root,可能造成erlang语言环境获取不到HOME参数;上述修改可以用在chkconfig管理和service管理的进程中,但是对于supervisor管理的进程,由于进程的启动命名在supervisor.conf中,不能直接修改HOME参数。

办法: 在supervisor的启动脚本中加入上述语句。

vi Ssupervisor.conf

#!/bin/sh
# chkconfig: 2345 70 90 export HOME=/usr/local/erlang
export PATH=$PATH:$HOME/bin
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
  • 这样做可以保证只是临时改变了HOME,但是对系统的HOME没有影响。

溯源

  • 为什么会有这个错误?

这个错误不是rabbitmq的原因,而是erlang语言环境的原因;查看一个erl进程:

ps aux | grep beam

# 结果:
root 1779 0.4 0.5 3863876 86060 ? Sl 19:21 0:06 /usr/local/erlang/bin/x86_64-unknown-linux-gnu/beam.smp -W w -A 64 -P 1048576 -t 5000000 -stbt db -zdbbl 32000 -K true -B i -- -root /usr/local/erlang -progname erl -- -home /root
  • 可以看到-home参数就是启动是加进去的,启动一个erl实例,其调用了erlexec的c文件;
# erlexec.c 文件的路径为/usr/local/erlang/erts/etc/common/erlexec.c

# 部分代码
static char * home;
static char ** Eargsp = NULL;
static int EargsCnt = 0;
static char **argsp = NULL; static void get_home( void )
{
home = get_env("HOME");
if (home == NULL)
error("HOME must be set");
}
  • 可以看到get_env函数获取HOME环境变量,如果获取失败就输出‘HOME must be set’。

  • 目前一个不明白的地方是HOME参数有一个默认的值/root,为什么get_env函数获取不到,而是返回了null;有待继续研究;

rabbitmq重启失败

  • 发现手动杀死rabbitmq的进程后,supervisor重启rabbitmq要么失败,要么不重启;

  • 如果采取supervisor后台的进程管理来启动和停止rabbitmq是可以的,但是如果手动杀死rabbitmq进程则无法重启进程;

原因:

  1. rabbitmq使用rabbitmq-server start 或使用rabbitmq-server启动后,会有两个进程,一个是erlang的节点服务程序;一个是rabbitmq的应用程序;rabbitmq的应用程序在erlang的节点上运行;

  2. 如果强制杀死rabbitmq的应用程序进程,supervisor会尝试启动,这时会尝试启动erlang的节点服务程序和rabbitmq的应用程序,发现已经存在一个erlang的节点服务程序,所以启动会失败;

  3. 如果强制杀死erlang的节点服务程序,这时erlang的节点服务程序和rabbitmq的应用程序都会被停止,如果配置参数为autorestart=unexpected 的话,那么supervisor不会去重启该进程,如果参数设置为autorestart=true,那么supervisor会去重启erlang的节点服务程序和rabbitmq的应用程序;

结论:

  1. 由supervisor管理rabbitmq进程并不是很合适,因为在rabbitmq的应用程序崩溃而erlang的节点服务程序正常的情况下,重启是失败的;

  2. 如果只有节点在运行,但是没有rabbitmq的应用程序实例,那么对于rabbitmq的管理后台也是无法登陆的。

supervisor之启动rabbitmq报错原因的更多相关文章

  1. centos 下启动 rabbitmq 报错的解决

    安装 rabbitmq 后进行了一些配置,然后启动服务: service rabbitmq-server start 无法启动.通过 journalctl -xe 查看日志后,有如下日志: ... - ...

  2. eclipse里启动rabbitmq报错 java.net.SocketException: Connection reset

    RabbitMQ学习之Java客户端连接测试(二) https://blog.csdn.net/roc1029/article/details/51249412 使用guest用户远程连接Rabbit ...

  3. Jenkins - Linux下启动Jenkins报错hudson.WebAppMain#contextDestroyed: Shutting down a Jenkins instance that was still starting up

    报错截图 在Linux下直接运行jenkins.war报错,导致启动失败 报错原因 运行端口已被其他进程占用 解决方法 换个启动端口就可以啦!

  4. Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans

    Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans

  5. 移动tomcat ,eclipse启动报错原因

    报错:错误路径Eclipse下启动tomcat报错:/bin/bootstrap.jar which is referenced by the classpath, does not exist. 1 ...

  6. maven 项目启动tomcat报错 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    maven项目启动tomcat报错: java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi ...

  7. 【转】Eclipse下启动tomcat报错:/bin/bootstrap.jar which is referenced by the classpath, does not exist.

    转载地址:http://blog.csdn.net/jnqqls/article/details/8946964 1.错误: 在Eclipse下启动tomcat的时候,报错为:Eclipse下启动to ...

  8. 学习中的错误——ubuntu 14.04 LTS 启动eclipse报错

    在ubuntu中启动eclipse报错:(Eclipse:15978): GLib-GIO-CRITICAL **: g_dbus_connection_get_unique_name: assert ...

  9. VirtualBox启动虚拟机报错0x80004005

    Unable to load R3 module C:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD): GetLastError=1790 ( ...

随机推荐

  1. jquery实现可编辑的下拉框( input + select )

    HTML: <input id="inputModel" /> <select name="EngineModel" size="1 ...

  2. SQL Server中使用自定义指定顺序排序

    比如需要对SQL表中的字段NAME进行如下的排序:张三(Z)李四(L)王五(W)赵六(Z) 如果想按 “ 张三.李四.王五.赵六”的顺序排序,则可以使用以下语句: order by charindex ...

  3. 管理与技术未必不可兼得,一个20年IT老兵的码农生涯

    作者|康德胜 我是一个喜欢写代码但几乎不太有机会写代码的CTO,也是一个看得懂财务报表.通过所有CFA(金融特许分析师)考试并获得FRM(金融风险经理)认证的拿到金融MBA的CTO,如果我有幸被称作码 ...

  4. Android开发性能优化总结(一)

    安卓开发应用首先要讲究良好的用户体验,如果一款软件卡顿现象严重,不流畅,经常崩溃,那么将给用户带来极不良好的体验,从而损失用户. 在实际开发和学习中,我总结了一下关于安卓性能的优化,供大家参考交流. ...

  5. Tajo--一个分布式数据仓库系统(分布式环境安装试用)

    前面两篇介绍了一下tajo,下面就说一下安装和使用吧. 一.分布式安装 前提:hadoop2中的hdfs和yarn已经安装并运行正常. 1.下载source并build源码 $git clone ht ...

  6. GDOI2015小Z的旅行路线

    GDOI2015小Z的旅行路线 题意: \(n\)个点的无根树,边上有权值. \(q\)个询问\(s\)和\(s\),问从\(s\)出发,找一条最长路(不经过重复点),保证路径上所有边边权不超过\(x ...

  7. MapReduce(三) 典型场景(一)

    一.mapreduce多job串联 1.需求 一个稍复杂点的处理逻辑往往需要多个 mapreduce 程序串联处理,多 job 的串联可以借助 mapreduce 框架的 JobControl 实现 ...

  8. day5-python基础

  9. Codeforces Round #271 (Div. 2) D 简单dp

    D. Flowers time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input ...

  10. 洛谷P2344 奶牛抗议

    题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为Ai,数字可正可负. ...