前言

今天重启了服务器,发现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. 第120天:移动端-Bootstrap基本使用方法

    一.Bootstrap使用 1.搭建Bootstrap页面骨架及项目目录结构 ``` ├─ /weijinsuo/ ··················· 项目所在目录 └─┬─ /css/ ···· ...

  2. hdu 6435 CSGO(最大曼哈顿距离)

    题目链接 Problem Description You are playing CSGO. There are n Main Weapons and m Secondary Weapons in C ...

  3. 洛谷 [USACO09OPEN]工作调度

    题面 读完题,我们会发现有一个很重要的信息,每件物品代价相同,但价值不同.那么我们很容易想到,在满足限制的情况下,我们肯定会选择价值尽可能大的物品. 我们可否用背包来实现呢,答案是否定的,或者说我不会 ...

  4. 520的信心赛——点点玩deeeep

                                   3.点点玩 deeeep(deeeep.cpp) 描述 点点最近迷上了 deeeep(此 de 非彼 de),在研究一个特殊的最长树链问题 ...

  5. Django字段类型介绍

    一,通过makemigrations,migrate来修改数据, 1.Django的ORM支持修改表结构,修改完以后,执行 python manage.py makemigrations  pytho ...

  6. 【刷题】洛谷 P4142 洞穴遇险

    题目背景 ZRQ在洞穴中准备采集矿物的时候遇险了!洞穴要塌了! 题目来源:zhoutb2333 题目描述 整个洞穴是一个 \(N*N\) 的方格图,每个格子形如 \((X,Y),1 \le X,Y \ ...

  7. 【BZOJ1494】【NOI2007】生成树计数(动态规划,矩阵快速幂)

    [BZOJ1494][NOI2007]生成树计数(动态规划,矩阵快速幂) 题面 Description 最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现: ·n个结点的环的生成树个数为 ...

  8. bzoj2396: 神奇的矩阵(矩阵乘法+随机化)

    这题n三方显然会GG... 运用矩阵乘法的性质A*B*R=A*(B*R)=C*R,于是随机化出一个一列的R,就可以把复杂度降低成n方...大概率是不会错的 #include<iostream&g ...

  9. vs下给生成的程序(exe)加入默认的申请管理员权限

    在vs下编程时,经常会用到一些特殊的权限,尤其是管理员权限,下面是在win7下笔者亲测通过的. 下面要分两种情况: 第一种情况就是在vs2003或者以下的编译器中运行 1.准备一个manifest文件 ...

  10. golang设置代理

    http://note.youdao.com/noteshare?id=a8df0ec2d623f282a782dbe937bdae9f