2012-12-17 5 views
8

Voglio scrivere una sorta di supervisore e sto cercando di implementare la funzione che chiude un programma esterno. Il processo esterno è collegato a un codice di erlang con una porta. Non ho idea di come chiudere questo programma, inviando un segnale o qualsiasi altra cosa. Chiudere una porta non è una soluzione, perché ho verificato che molti programmi non escano da SIGPIPE. Hai qualche idea su come farlo?Killing un processo collegato a una porta di erlang

+0

Si trova sulla stessa macchina? Hai il PID? –

risposta

8

È possibile utilizzare

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

per ottenere il pid del processo nel sistema operativo (vedi http://erlang.org/doc/man/erlang.html#port_info-1 - Credo che potrebbe essere necessario una versione recente di Erlang per questo da includere, penso che quello installato da apt-get su Ubuntu 12.04 non è abbastanza recente, so R15B02 ha però) e poi

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

di ucciderlo (http://erlang.org/doc/man/os.html#cmd-1).

+0

Ha funzionato per me, ma puoi spiegare perché invii il segnale di uccisione? È solo un esempio o ci sono dei motivi per finire il processo in quel modo? –

+0

Hai chiesto come terminare il processo :) Puoi anche inviare un messaggio al processo tramite la porta usando erlang: port_command/2 e dirgli di smettere delicatamente. –

1

È possibile interrompere il processo esterno se si elimina il processo di collegamento di ellang. Utilizzare in questo modo:

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

Ma non è possibile eliminare il processo esterno bloccato con I/O.