首页 > 解决方案 > 即使指定了 -setcookie,为什么 Erlang escript 仍会创建 .erlang.cookie

问题描述

我有一个公司 Erlang 应用程序,它通过使用参数 -setcookie 调用 escript 来调用。即使在命令行中指定了 cookie,程序最终仍会创建 $HOME/.erlang.cookie。这是一个问题,因为有时文件获得了错误的权限,这随后会阻止程序运行。

我不知道为什么权限会被更改,但如果程序在我不需要它时停止创建它,我不会有问题。如果在命令行上提供了值,有没有办法让它不创建 cookie 文件?由于提供了参数,因此似乎不需要此 cookie 文件。(如果确实需要创建文件,为什么要创建日期但没有时间?

我有 erts-10.3.1。

@dolphin2017 回答后的更多信息。该脚本实际上是由酿酒厂工具提供的。我们调用 nodetool ,它是用这些代码位编码的。

main(Args) ->
    ok = start_epmd(),
    %% Extract the args
    {RestArgs, TargetNode} = process_args(Args, [], undefined),

和 process_args 如下所示:

process_args([], Acc, TargetNode) ->
    {lists:reverse(Acc), TargetNode};
process_args(["-setcookie", Cookie | Rest], Acc, TargetNode) ->
    erlang:set_cookie(node(), list_to_atom(Cookie)),
    process_args(Rest, Acc, TargetNode);
process_args(["-name", TargetName | Rest], Acc, _) ->
    ThisNode = append_node_suffix(TargetName, "_maint_"),
    {ok, _} = net_kernel:start([ThisNode, longnames]),
    process_args(Rest, Acc, nodename(TargetName));
process_args(["-sname", TargetName | Rest], Acc, _) ->
    ThisNode = append_node_suffix(TargetName, "_maint_"),
    {ok, _} = net_kernel:start([ThisNode, shortnames]),
    process_args(Rest, Acc, nodename(TargetName));
process_args([Arg | Rest], Acc, Opts) ->
    process_args(Rest, [Arg | Acc], Opts).

在我看来,这涵盖了 Dolphin2017 建议的所有内容,包括节点名、开始和 set_cookie,所以我不确定还需要什么。

现在发现这是来自酿酒厂的我也将尝试将其转移到他们的各种沟通渠道。但请随时在此处添加更多内容。

标签: erlang

解决方案


这是解决方案:

#!/usr/bin/env escript
-mode(compile).
main(_) ->
   SelfNode = ...,%atom, self node name
   Cook = ...,% atom,cookie
   net_kernel:start([SelfNode, longnames]),%
   erlang:set_cookie(node(), Cook),
   rpc:call(TargetNode,...),% do operation with target node
   ...

推荐阅读