2 Stimmen

OS-Prozessverwaltung von Erlang

Was ist der beste Weg, um OS-Prozessmanagement von Erlang aus zu betreiben? Ich muss in der Lage sein, untergeordnete OS-Prozesse zu starten, in die stdin des untergeordneten Prozesses zu schreiben, von stdout und stderr zu lesen, Kill-Signale zu senden und über Exit-Codes informiert zu werden. Ich sehe nicht, dass dies mit dem, was in erts ist, möglich ist.

Ich weiß von erlexec aber ich weiß nicht, ob es stabil ist oder ob jemand es tatsächlich im Zorn benutzt. Gibt es noch andere Möglichkeiten, oder ist das die beste?

3voto

Hafen Programme sind der beste Weg, um dies zu erreichen. Port-Programme sind sicher und schaden der Erlang-VM nicht, und wenn sie abstürzen oder sich falsch verhalten, können sie wie jeder andere Erlang-Prozess beendet und neu gestartet werden.

Hafen Treiber sind unterschiedlich und können, wenn sie sich falsch verhalten, die gesamte Erlang-VM zum Absturz bringen.

2voto

hdima Punkte 3617

In Erlang ist die Standardmethode zur Verwaltung von OS-Prozessen Häfen .

Der Exit-Status des gespawnten OS-Prozesses wird als Nachricht gesendet, wenn die Option exit_status hinzugefügt zu offener_Hafen :

1> P = open_port({spawn, "/bin/ls unknown_file_name"}, [exit_status]).
#Port<0.486>
/bin/ls: cannot access unknown_file_name: No such file or directory
2> flush().
Shell got {#Port<0.486>,{exit_status,2}}
ok

Daten können auf stdin des gespawnten OS-Prozesses geschrieben werden, indem eine Nachricht an port gesendet wird oder indem port_befehl Funktion und der Inhalt von stdout wird als Nachricht gesendet. (Beachten Sie auch {line, L} y {packet, N} Optionen von open_port ) :

1> P = open_port({spawn, "/bin/cat"}, [stream, binary]).
#Port<0.486>
2> true = port_command(P, <<"data">>).
true
3> flush().
Shell got {#Port<0.486>,{data,<<"data">>}}
ok
4> true = port_close(P).
true

Stderr kann auch nach stdout umgeleitet werden:

1> P = open_port({spawn, "/bin/ls unknown_file_name"}, [stderr_to_stdout, binary]).
#Port<0.486>
2> flush().
Shell got {#Port<0.486>,
    {data,<<"/bin/ls: cannot access unknown_file_name: No such file or directory\n">>}}
ok

Sie können jedoch keine Kill-Signale mit Ports senden, aber wenn Sie Ports schließen, indem Sie eine Nachricht an Port senden oder indem Sie port_close Der externe Prozess kann beendet werden durch SIGPIPE Signal.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X