【问题标题】:Killing a process connected to an erlang's port杀死连接到 erlang 端口的进程
【发布时间】:2015-05-23 22:16:27
【问题描述】:

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

【问题讨论】:

  • 是在同一台机器上吗?你有 PID 吗?

标签: erlang


【解决方案1】:

你可以使用

{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)。

【讨论】:

  • 它对我有用,但你能解释一下你为什么发送终止信号吗?这只是一个例子还是有一些原因以这种方式完成过程?
  • 你问如何杀死进程 :) 你也可以使用 erlang:port_command/2 通过端口向进程发送消息并告诉它轻轻停止。
【解决方案2】:

如果你杀死链接的 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 读取阻塞的外部进程。

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2017-01-19
    • 2021-07-24
    • 2020-06-08
    • 2013-02-08
    相关资源
    最近更新 更多