博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
supervisor之启动rabbitmq报错原因
阅读量:5244 次
发布时间:2019-06-14

本文共 2047 字,大约阅读时间需要 6 分钟。

前言

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

报错:erlexec:HOME must be set

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

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

vi Ssupervisor.conf#!/bin/sh# chkconfig: 2345 70 90export HOME=/usr/local/erlangexport 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的管理后台也是无法登陆的。

转载于:https://www.cnblogs.com/cwp-bg/p/8939792.html

你可能感兴趣的文章
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>
PHP 导出 Excell
查看>>
Java基础教程——网络基础知识
查看>>
Kruskal基础最小生成树
查看>>
浅谈算法和数据结构: 一 栈和队列
查看>>
Java内部类详解
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
图论-次短路求法
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>
JSON跨域解决方案收集
查看>>
SSH框架整合总结
查看>>
图的深度优先遍历
查看>>
C# 之 提高WebService性能大数据量网络传输处理
查看>>