2016-01-21 12 views
5

Sto cercando di capire come estrarre lo stdout e lo stderr da un sottoprocesso di sistema in Erlang. (Da non confondere con un processo di Erlang.) Il gotcha è che sto provando a tirare l'output dei flussi in modo indipendente.In Erlang, come posso acquisire in modo indipendente lo stdout e lo stderr di un sottoprocesso?

open_port/2 sembra ottenere la maggior parte del modo lì, tuttavia non sembra fornire un modo per differenziare tra i due flussi. C'è l'opzione stderr_to_stdout, ma non è quello che voglio; Voglio ottenere dati da entrambi i flussi di dati ma essere in grado di distinguere i due flussi.

Qualche suggerimento? Grazie.

Aggiornamento: Sono idealmente alla ricerca di una soluzione che funzioni sia su Windows che su Linux.

risposta

0

Si consiglia di provare erlexec. Come spiega its documentation, consente il controllo separato su stdout e stderr e, in generale, è molto più flessibile di open_port/2 per la gestione dei processi del sistema operativo da Erlang.

+0

Hmm ... Questo sembra essere molto promettente. Una parte che non ho menzionato nella mia domanda è che sto cercando una soluzione che funzioni sia su Windows che su Linux; erlexec non sembra "supportare" Windows. Ci proverò ancora e vedrò se funziona nonostante non sia supportato. – Vultaire

+0

... e la risposta è "no". Il supporto dovrebbe essere aggiunto. Quale può essere la risposta; sperando che ci sia un'alternativa più semplice ... – Vultaire

+0

In base alla mancanza di risposta da parte degli altri, considereremo una soluzione compatibile con Windows come una possibile lacuna. Mettendo da parte Windows, erlexec sembra la soluzione giusta in generale, quindi accetterò come risposta. – Vultaire

0

Prova questo:

Path = filename:join(["./priv", "log", "log_file_name"]), 
{ok, F} = file:open(Path, [write]), 
group_leader(F, self()), 
erlang:display("Anything this process outputs now gets redirected"). 
+0

Interessante e buona conoscenza per me sapere ... La domanda però riguardava l'acquisizione di stdout/stderr dei processi esterni, non dei processi di Erlang. – Vultaire

+1

Penso che si possa considerare di modificare la domanda per dire "da un processo di sistema usando Erlang" vs "da un sottoprocesso in Erlang" in quanto ciò può confondere i futuri Googli. –

+0

Sì, penso sia giusto. – Vultaire