【问题标题】:mnesia save out infomnesia 保存信息
【发布时间】:2011-04-02 19:23:31
【问题描述】:

如何保存 mnesia:info() 输出?

我在 unix 屏幕中使用远程 sh,无法滚动窗口

【问题讨论】:

  • “unix 屏幕”是什么意思。你是说 screen(1) 命令吗?你真的在使用远程 shell rsh(1)(你应该使用 ssh btw)吗?为什么不能滚动?如果您描述了连接到 erlang 的确切方式,我相信您的问题可以解决,但您的问题缺少信息。
  • 我通过 ssh 连接到我的远程服务器,在本地我使用 rsm erlang 节点连接到工作节点,然后运行 ​​mnesia:system_info() - 输出太长并且超出屏幕, a 只能看到最后 30 行,并且滚动对我没有帮助

标签: erlang mnesia


【解决方案1】:

这是一个可以放在远程节点上的 user_default.erl 模块中的函数:

  out(Fun, File) ->
    G = erlang:group_leader(),
    {ok, FD} = file:open(File, [write]),
    erlang:group_leader(FD, self()),
    Fun(),
    erlang:group_leader(G, self()),
    file:close(FD).

然后,您可以执行以下操作(重新编译并加载 user_default 后):

  1> out(fun () -> mnesia:info() end, "mnesia_info.txt").

或者,只需将以下内容剪切并粘贴到外壳中:

  F = fun (Fun, File) ->
        G = erlang:group_leader(),
        {ok, FD} = file:open(File, [write]),
        erlang:group_leader(FD, self()),
        Fun(),
        erlang:group_leader(G, self()),
        file:close(FD)
      end,
  F(fun () -> mnesia:info() end, "mnesia_info.txt").

【讨论】:

    【解决方案2】:

    如果您位于终端而不滚动(如果您在 xterm 上并且看不到滚动条,只需打开它)一个非常有用的工具是 screen:它提供虚拟 vt100 终端,您可以在终端之间切换甚至脱离它并稍后再回来(非常适合需要偶尔交互的远程服务器上长时间运行的程序)。

    您可以将脚本记录到文件中并在虚拟终端的输出中滚动。

    如果您使用的是类似 Unix 的系统,您可能只需要安装一个预构建的软件包,如果一切都失败了,您可以随时获取源代码并自己构建它。

    另请参阅article 以了解其他解决方案。

    如果你无法在系统上安装screen,一个简单但不太舒服的仅使用 Unix 内置东西的 hack 是:

    使用tee(1) 启动erlang shell 以重定向输出:

    $ erl | tee output.log
    Eshell V5.7.5  (abort with ^G)
    1> mnesia:info().
    ===> System info in version {mnesia_not_loaded,nonode@nohost,
                                    {1301,742014,571300}}, debug level = none <===
    opt_disc. Directory "/usr/home/peer/Mnesia.nonode@nohost" is NOT used.
    use fallback at restart = false
    running db nodes   = []
    stopped db nodes   = [nonode@nohost] 
    ok
    2>    
    

    退出 shell 有点困难(您可能必须键入 ^D 才能结束输入文件),但是文件中有 tty 输出:

    $ cat output.log 
    Eshell V5.7.5  (abort with ^G)
    1> ===> System info in version {mnesia_not_loaded,nonode@nohost,
                                    {1301,742335,572797}}, debug level = none <===
    ...
    

    【讨论】:

      【解决方案3】:

      我相信你做不到。请参阅 system_info(all)。

      【讨论】:

        【解决方案4】:

        转换为字符串:

        S = io_lib:format("~p~n", [mnesia:info()]).
        

        然后将其写入磁盘。

        【讨论】:

        • 因为 system_info() 写入 tty
        • 无赖 :) 这会教我在不尝试的情况下尝试提供帮助,嗯?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多