2012-12-17 13 views
8

Chcę napisać coś w rodzaju nadzorcy i próbuję zaimplementować funkcję, która zamyka zewnętrzny program. Proces zewnętrzny jest połączony z kodem erlanga za pomocą portu. Nie mam pojęcia, jak zamknąć ten program, wysyłając sygnał lub cokolwiek innego. Zamknięcie portu nie jest rozwiązaniem, ponieważ sprawdziłem, że wiele programów nie wychodzi z SIGPIPE. Czy masz jakieś pomysły, jak to zrobić?Zabijanie procesu podłączonego do portu erlanga

+0

Czy jest na tym samym urządzeniu? Czy masz PID? –

Odpowiedz

8

Można użyć

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

uzyskać PID procesu w systemie operacyjnym (patrz http://erlang.org/doc/man/erlang.html#port_info-1 - Myślę, że być może trzeba najnowszą wersję Erlang na to, aby zostać włączone, myślę, że ten, zainstalowany przez apt-get na Ubuntu 12.04 nie jest na tyle niedawno, wiem R15B02 ma go jednak), a następnie

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

aby go (http://erlang.org/doc/man/os.html#cmd-1) zabić.

+0

To zadziałało dla mnie, ale czy możesz wyjaśnić, dlaczego wysłałeś sygnał zabicia? To tylko przykład, czy istnieją pewne powody, aby zakończyć proces w ten sposób? –

+0

Zapytałeś, jak zabić proces :) Możesz również wysłać wiadomość do procesu przez port za pomocą polecenia erlang: port_command/2 i nakazać mu delikatne zatrzymanie. –

1

Możesz zabić proces zewnętrzny, jeśli zabijesz połączony proces erlang. Użyj tej metody:

-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). 

Nie można jednak zabić procesu zewnętrznego, który został zablokowany przez odczyt IO.

Powiązane problemy