10

ある種のスーパーバイザーを書きたいのですが、外部プログラムを閉じる機能を実装しようとしています。外部プロセスは、ポートを使用して erlang のコードに接続されます。シグナルなどを送信して、このプログラムを閉じる方法がわかりません。多くのプログラムが SIGPIPE で終了しないことを確認したため、ポートを閉じることは解決策ではありません。それを行う方法について何かアイデアはありますか?

4

2 に答える 2

11

使用できます

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

OSでプロセスのpidを取得するには(http://erlang.org/doc/man/erlang.html#port_info-1-を参照してください-これを含めるには、Erlangの最新バージョンが必要になる可能性があると思いますapt-getによってUbuntu12.04にインストールされたものは十分に最近のものではありませんが、R15B02にインストールされていることはわかっています)そして

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

それを殺すために(http://erlang.org/doc/man/os.html#cmd-1)。

于 2012-12-17T10:55:51.470 に答える
1

リンクされた erlang プロセスを kill すると、外部プロセスを kill できます。次のように使用します。

-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 読み取りでブロックされた外部プロセスを強制終了することはできません。

于 2015-05-23T12:52:23.950 に答える