2012-12-17 3 views
8

何らかのスーパーバイザを書きたいと思っています。私は外部プログラムを閉じる関数を実装しようとしています。外部プロセスは、ポートを持つerlangのコードに接続されています。私は、このプログラムを閉じる方法や、シグナルなどを送ることは考えていません。多くのプログラムがSIGPIPEで終了しないことを確認したので、ポートを閉じることは解決策ではありません。あなたはそれをする方法を知っていますか?erlangのポートに接続されたプロセスを終了する

+0

同じマシンにありますか?あなたはPIDを持っていますか? –

答えて

8

あなたがOSでのプロセスのPIDを取得するために

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

を使用することができます(http://erlang.org/doc/man/erlang.html#port_info-1を参照してください - 私はあなたが含まれるように、このためのErlangの最新バージョンを必要とするかもしれないと思う、私はによってインストールされたものを考えますUbuntuの12.04でapt-getの十分最近ではありません、私はR15B02はしかし、それを持って知っている)、その後

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

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

+0

それは私のために働いたが、なぜ殺す信号を送るのか説明することができますか?それは単なる例ですか、そういう仕方で仕上げる理由は何ですか? –

+0

あなたはプロセスをkillする方法を尋ねました:) また、erlang:port_command/2を使用してポート経由でプロセスにメッセージを送信し、穏やかに停止するように指示することもできます。 –

1

リンクされたプロセスを強制終了すると、外部プロセスを強制終了できます。

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

関連する問題