杀死连接到erlang端口的进程

时间:2012-12-17 07:25:12

标签: erlang

我想写一个某种主管,我正在尝试实现关闭外部程序的功能。外部进程通过端口连接到erlang的代码。我不知道如何关闭这个程序,通过发送信号或其他任何东西。关闭端口不是解决方案,因为我已经检查过许多程序没有在SIGPIPE上退出。你有什么想法怎么做吗?

2 个答案:

答案 0 :(得分:9)

您可以使用

{os_pid, OsPid} = erlang:port_info(Port, os_pid). 

获取操作系统中进程的pid(参见http://erlang.org/doc/man/erlang.html#port_info-1 - 我认为你可能需要最新版本的Erlang才能包含它,我认为apt-get在Ubuntu 12.04上安装的版本不是最近,我知道R15B02有它然后

os:cmd(io_lib:format("kill -9 ~p", [OsPid])).

杀死它(http://erlang.org/doc/man/os.html#cmd-1)。

答案 1 :(得分:1)

如果您终止链接的erlang进程,则可以终止外部进程。使用这种方式:

-module(portest).
-export([start/1, init/1, kill/0]).

start(ExtPrg) ->
   spawn(?MODULE, init, [ExtPrg]).

init(ExtPrg) ->
   process_flag(trap_exit, true),
   Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
   register(extport, self()),
   loop(Port).

kill() ->
   exit(whereis(extport), kill).

但你无法杀死被IO读取阻止的外部进程。