`ejabberdctl start`导致“内核pid终止”错误 - 我该怎么办?

时间:2013-09-05 14:51:22

标签: erlang ejabberd crash-dumps

我用Google搜索了三个小时但无济于事。

我有一个未使用apt安装的ejabberd安装。它是从源安装的,并没有名为ejabberd的程序。开始和停止,一切都是通过ejabberdctl。

它运行了一个月,突然有一天它停止了臭名昭着的

kernel pid terminated error

我随时

sudo ejabberdctl start --node ejabberd@MasterService

生成erl_crash文件,当我尝试

ejabberdctl

我得到了

Failed to connect to RPC at node ejabberd@MasterService

现在我尝试了什么

  1. 试图杀死所有正在运行的ejabberd,beam,epmd并开始新鲜的进程 - DID NOT WORK
  2. 检查/ etc / hosts和主机名,一切都很好。主机名在主机文件中提供,带有IP
  3. 检查ejabberdctl.conf文件以确保主机名确实正确且节点名称正确
  4. 已检查.erlange.cookie文件正在创建,其中包含内容
  5. 在所有的网络中,搜索引导我进入上述任何一种方式。

    我无处可去,不知道还有什么去看。任何帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

您必须分析崩溃转储以尝试猜测它失败的原因。

为了执行此任务,Erlang有一个特殊的webtool(称为嗯,webtool),可以使用特殊的应用程序 - Crash Dump Viewer - 来加载转储并检查Erlang的堆栈跟踪崩溃时的过程。

你必须

  1. 安装必要的软件包:

    # apt-get install erlang-webtool erlang-observer
    
  2. 启动Erlang解释器:

    $ erl
    

    (在那里采取进一步行动。)

  3. 运行webtool。在最简单的情况下,它将监听本地主机:

    webtool:start().
    

    (注意句号。)它会打印一个URL,在浏览器中导航以访问正在运行的工具。

    如果在服务器上发生这种情况,并且您更愿意让webtool监听某些非本地主机接口,那么呼叫限制将会更加棘手:

    webtool:start(standard_path, [{port, 8888}, {bind_address, {0, 0, 0, 0}}, {server_name, "server.example.com"}]).
    

    {0, 0, 0, 0} IP规范会让它随处听,你也可以指定一些更明智的八位字节,比如{192, 168, 0, 1}server_name子句可能使用任意名称 - 这将在生成的URL(服务器的主机名)中打印。

  4. 现在使用浏览器连接到该工具,导航到“启动工具”菜单条目,启动崩溃转储查看器并在工具的顶部菜单中显示指向它的链接。继续那里,找到一个加载崩溃转储的链接。

  5. 加载崩溃转储后,尝试使用工具的界面来查看活动Erlang进程的堆栈跟踪。其中至少有一个应该包含一些可疑的内容,其中应该包含一条错误消息 - 这就是您正在寻找的用于优化问题的内容(或者在ejabberd mailing list上询问另一个问题)。

  6. 要退出该工具,请运行

    webtool:stop().
    

    在运行Erlang解释器中。然后通过运行

    退出它
    q().
    

    然后等待或按Ctrl-g,然后输入字母q,然后按返回键。

  7. 相关链接包括:crash dump viewer manualwebtool manual