今天重启了服务器,发现supervisor管理的rabbitmq的进程竟然启动失败了,查看日志发现总是报错,记录一下解决的办法。linux
export HOME=/usr/local/erlang export PATH=$PATH:$HOME/bin
办法: 在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
这个错误不是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
# 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’。rest
目前一个不明白的地方是HOME参数有一个默认的值/root,为何get_env函数获取不到,而是返回了null;有待继续研究;日志
发现手动杀死rabbitmq的进程后,supervisor重启rabbitmq要么失败,要么不重启;code
若是采起supervisor后台的进程管理来启动和中止rabbitmq是能够的,可是若是手动杀死rabbitmq进程则没法重启进程;server
缘由:rabbitmq
rabbitmq使用rabbitmq-server start 或使用rabbitmq-server启动后,会有两个进程,一个是erlang的节点服务程序;一个是rabbitmq的应用程序;rabbitmq的应用程序在erlang的节点上运行;进程
若是强制杀死rabbitmq的应用程序进程,supervisor会尝试启动,这时会尝试启动erlang的节点服务程序和rabbitmq的应用程序,发现已经存在一个erlang的节点服务程序,因此启动会失败;get
若是强制杀死erlang的节点服务程序,这时erlang的节点服务程序和rabbitmq的应用程序都会被中止,若是配置参数为autorestart=unexpected 的话,那么supervisor不会去重启该进程,若是参数设置为autorestart=true,那么supervisor会去重启erlang的节点服务程序和rabbitmq的应用程序;
结论:
由supervisor管理rabbitmq进程并非很合适,由于在rabbitmq的应用程序崩溃而erlang的节点服务程序正常的状况下,重启是失败的;
若是只有节点在运行,可是没有rabbitmq的应用程序实例,那么对于rabbitmq的管理后台也是没法登录的。