2011-04-24 26 views
2

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

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

回答

3

Port程序是最好的方式来做到这一点。端口程序是安全的,不会损害Erlang虚拟机,如果它们崩溃或错误行为可以像任何其他Erlang进程一样被终止并重新启动。

端口驱动程序是不同的,如果他们错误行为可以打倒整个Erlang虚拟机。

+0

好的。 erlexec是一个为运行任意子进程而设计的端口程序,所以它至少看起来像正确的方法。虽然有人似乎没有人使用过它,这有点奇怪 - 是否真的那么不常见? – regularfry 2011-04-27 11:40:30

+0

以任何合理的语言编写端口包装程序非常简单,C和Python都有用于将术语转换为二进制文件并再转换回语言本地结构的库。 'erlexec'是任何任意可执行文件的通用包装程序。如果你想要特定的行为,并且大多数人都这样做,他们会编写自己的Port wrapper程序。我通常使用Python,因为它们是小代理程序,具有很少的逻辑和序列化的性能,反序列化通常不是问题。 – 2011-04-27 15:07:02

2

在Erlang管理OS进程的标准方式是ports。衍生OS处理的

退出状态将被发送作为一条消息,如果选项exit_status加到open_port

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

数据可以通过将消息发送到端口或通过port_command功能被写入衍生OS处理的标准输入标准输出内容将作为消息发送。 (注意:也{line, L}open_port{packet, N}选项):

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 

标准错误也可以被重定向到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 

但是你不能用端口,但如果发送中止信号您通过发送关闭端口一个消息到端口或通过调用port_close外部进程可以通过SIGPIPE信号退出。