Einen Shell-Befehl von Node.js ausführen, ohne die Ausgabe zu puffern
Ich versuche zu starten, einen shell-Befehl aus Node.js, ohne Umleitung des Befehls input-und output-genau wie Beschuss aus, um einen Befehl über ein shell-Skript, oder mithilfe von Ruby ' s system
Befehl. Wenn der Kind-Prozess will schreiben auf STDOUT, ich will, dass, um direkt auf die Konsole (oder umgeleitet, wenn mein Knoten app, die die Ausgabe umgeleitet wurde).
Knoten nicht scheinen, um eine einfache Möglichkeit, dies zu tun. Es sieht aus wie der einzige Weg, ein anderer Prozess mit child_process
, die immer leitet die child-Prozesse input-und output-pipes. Kann ich code schreiben, um Daten zu akzeptieren, aus denen Rohre und schreiben Sie es auf meinen Prozess STDOUT und STDERR, aber wenn ich das mache, die APIs, die mich zwingen, mich zu opfern, eine gewisse Flexibilität.
Möchte ich zwei Funktionen:
- Shell-syntax. Ich möchte in der Lage sein Rohr Ausgabe zwischen den Befehlen oder ausführen von Windows batch-Dateien.
- Unbegrenzten Ausgang. Wenn ich ' m Beschuss aus einem compiler und will Sie generieren Megabyte compiler-Warnungen, will ich Sie alle zu scrollen über den Bildschirm (bis der Benutzer bekommt es satt und trifft Strg+C).
Sieht es aus wie ein Knoten will mich zwingen wählen Sie zwischen diesen beiden Funktionen.
- Wenn ich will, eine unbegrenzte Anzahl von Ausgabe, die ich verwenden kann
child_process.spawn
und dann tunchild.stdout.on('data', function(data) { process.stdout.write(data); });
und die gleiche Sache fürstderr
, und es werde es gerne weiterleiten von Daten, bis die Kühe nach Hause kommen. Leiderspawn
unterstützt keine shell-syntax. - Wenn ich will-shell-syntax, die ich verwenden kann
child_process.exec
. Aberexec
besteht auf die Pufferung der Kindprozess STDOUT und STDERR für mich und geben Sie mir alle am Ende, und es begrenzt die Größe dieser Puffer (konfigurierbar, 200K standardmäßig). Ich kann noch Haken, dieon('data')
Veranstaltungen, wenn ich will, um die Ausgabe zu sehen, wie es generiert, aberexec
noch die Daten in seinen Puffer zu. Wenn die Menge der Daten übersteigt die vordefinierten Puffer-Größeexec
beenden wird der Kind-Prozess.
(Es gibt auch child_process.execFile
, die die schlimmsten beider Welten aus einer Flexibilität Standpunkt: keine shell-syntax, aber Sie haben noch bis zum cap die Höhe der Ausgabe, die Sie erwarten.)
Bin ich etwas fehlt? Gibt es eine Möglichkeit, nur shell aus zu einem Kind-Prozess in Knoten, und nicht leiten Ihre input-und output? Etwas, das unterstützt shell-syntax und nicht Scheiße aus, nach einer vordefinierten Höhe der Ausgabe, gerade wie verfügbar ist in shell-Skripte, Ruby, etc.?
InformationsquelleAutor der Frage Joe White | 2012-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Erben stdin/out/error streams über
spawn
argument, so dass Sie nicht brauchen, um Rohr manuell:Verwenden von shell für shell - syntax für die bash ist es
-c
parameter zu Lesen Skript von string:Zusammenfassen:
InformationsquelleAutor der Antwort Andrey Sidorov
Habe ich noch nicht benutzt, aber ich habe gesehen, dass dieses Bibliothek: https://github.com/polotek/procstreams
Es Sie würde dies tun. Die
.out()
automatisch Rohre, um den Prozess stdin/out.Wenn nicht Unterstützung-shell-syntax, aber das ist ziemlich trivial, denke ich.
InformationsquelleAutor der Antwort loganfsmyth
Können Sie ersetzen
exec
durchspawn
und verwenden Sie die shell-syntax einfach mit:Die Magie ist nur
{shell: true}
.InformationsquelleAutor der Antwort Skywalker13
Gibt es ein Beispiel in der Knoten docs für die child_process Modul:
Beispiel abnehmen ein langer Prozess und Umlenkung dessen Ausgabe in eine Datei:
InformationsquelleAutor der Antwort darelf