Process 来自Erlang的操作系统进程管理

Process 来自Erlang的操作系统进程管理,process,erlang,operating-system,Process,Erlang,Operating System,从Erlang执行操作系统进程管理的最佳方法是什么?我需要能够生成子操作系统进程,写入子操作系统的stdin,读取stdout和stderr,发送kill信号,并获得退出代码的通知。我不认为这在erts中是可能的 我知道,但我不知道它是否稳定,或者是否有人在愤怒中使用它。还有其他选择吗?或者这是最好的选择吗?程序是最好的选择。端口程序是安全的,不会损害Erlang VM,如果它们崩溃或行为不当,可以像任何其他Erlang进程一样终止并重新启动 端口驱动程序是不同的,如果它们行为不当,可能会导致整

从Erlang执行操作系统进程管理的最佳方法是什么?我需要能够生成子操作系统进程,写入子操作系统的stdin,读取stdout和stderr,发送kill信号,并获得退出代码的通知。我不认为这在erts中是可能的

我知道,但我不知道它是否稳定,或者是否有人在愤怒中使用它。还有其他选择吗?或者这是最好的选择吗?

程序是最好的选择。端口程序是安全的,不会损害Erlang VM,如果它们崩溃或行为不当,可以像任何其他Erlang进程一样终止并重新启动


端口驱动程序是不同的,如果它们行为不当,可能会导致整个Erlang VM崩溃。

在Erlang中,管理操作系统进程的标准方法是

如果将选项Exit_status添加到以下位置,则生成的操作系统进程的退出状态将作为消息发送:

还可以将Stderr重定向到stdout:

1> P = open_port({spawn, "/bin/ls unknown_file_name"}, [stderr_to_stdout, binary]).
#Port<0.486>
2> flush().
Shell got {#Port<0.486>,
    {data,<<"/bin/ls: cannot access unknown_file_name: No such file or directory\n">>}}
ok

但是,您不能通过端口发送终止信号,但如果您通过向端口发送消息或调用外部进程来关闭端口,则可以通过信号退出。

Ok。erlexec是一个端口程序,设计用于运行任意子进程,因此它看起来至少是正确的方法。有点奇怪的是,似乎没有其他人使用过它——这真的是一个不寻常的要求吗?用任何合理的语言编写端口包装程序都非常简单,C和Python都有库,可以将术语转换为二进制,然后再转换回语言的本机结构。erlexec是一个通用包装程序,用于任何任意可执行文件。如果您需要特定的行为,大多数人都需要,他们会编写自己的端口包装程序。我通常使用Python,因为它们是小型代理程序,几乎并没有逻辑,序列化和反序列化的性能通常并没有问题。
1> P = open_port({spawn, "/bin/cat"}, [stream, binary]).
#Port<0.486>
2> true = port_command(P, <<"data">>).
true
3> flush().
Shell got {#Port<0.486>,{data,<<"data">>}}
ok
4> true = port_close(P).
true
1> P = open_port({spawn, "/bin/ls unknown_file_name"}, [stderr_to_stdout, binary]).
#Port<0.486>
2> flush().
Shell got {#Port<0.486>,
    {data,<<"/bin/ls: cannot access unknown_file_name: No such file or directory\n">>}}
ok