Ich habe ein Skript, das 'hi' ausgibt, eine Sekunde lang schläft, 'hi' ausgibt, 1 Sekunde lang schläft und so weiter und so fort. Jetzt dachte ich, ich könnte dieses Problem mit diesem Modell lösen.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Das Problem ist nun, dass die Aufgabe beendet werden muss, damit die Ausgabe angezeigt wird. Soweit ich weiß, liegt dies daran, dass der neu erzeugte Prozess die Ausführungskontrolle übernimmt. Offensichtlich unterstützt node.js keine Threads, also irgendwelche Lösungen? Meine Idee war es, möglicherweise zwei Instanzen auszuführen, die erste für den spezifischen Zweck des Erstellens der Aufgabe, und die Ausgabe an den Prozess der zweiten Instanz weiterzuleiten, da dies erreicht werden kann.
node.js
spawn
capture-output
foklepoint
quelle
quelle
python
wird, vergessen Sie nicht, das-u
Flag zu übergeben, damit die Konsolenausgabe nicht gepuffertAntworten:
Ich mache immer noch meine Füße nass mit Node.js, aber ich habe ein paar Ideen. Erstens glaube ich, dass Sie
execFile
anstelle von verwenden müssenspawn
;execFile
ist für den Fall, dass Sie den Pfad zu einem Skript haben, währendspawn
für die Ausführung eines bekannten Befehls, den Node.js für Ihren Systempfad auflösen kann.1. Geben Sie einen Rückruf ein , um die gepufferte Ausgabe zu verarbeiten:
2. Fügen Sie dem stdout- Stream des untergeordneten Prozesses ( 9thport.net ) einen Listener hinzu.
Darüber hinaus scheint es Optionen zu geben, mit denen Sie den erzeugten Prozess vom steuernden Terminal des Knotens trennen können, wodurch er asynchron ausgeführt werden kann. Ich habe dies noch nicht getestet, aber es gibt Beispiele in den API-Dokumenten , die ungefähr so aussehen:
quelle
child.spawn()
mit dershell
Option auf verwendentrue
. nodejs.org/api/…child.stdout.pipe(process.stdout);
javascript let childProcess = exec ( './script-to-run --arg1 arg1value', ( error, stdout, stderror ) => { console.log( '[CALLBACK]: ' + error ); // or stdout or stderror } ); // Same as with spawn: childProcess.stdout.on ( 'data', ( data ) => { console.log( '[LIVE]: ' + data ); // Here's your live data! } );
Es ist jetzt viel einfacher (6 Jahre später)!
Spawn gibt ein childObject zurück , mit dem Sie dann auf Ereignisse warten können . Die Ereignisse sind:
Es gibt auch eine Reihe von Objekten aus childObject :
Weitere Informationen zu childObject finden Sie hier: https://nodejs.org/api/child_process.html
Asynchron
Wenn Sie Ihren Prozess im Hintergrund ausführen möchten, während der Knoten weiterhin ausgeführt werden kann, verwenden Sie die asynchrone Methode. Sie können weiterhin Aktionen ausführen, nachdem Ihr Prozess abgeschlossen wurde und wenn der Prozess eine Ausgabe hat (z. B. wenn Sie die Ausgabe eines Skripts an den Client senden möchten).
child_process.spawn (...); (Knoten v0.1.90)
So würden Sie eine Callback + asynchrone Methode verwenden :
Mit der obigen Methode können Sie jede Ausgabezeile des Skripts an den Client senden (z. B. mit Socket.io, um jede Zeile zu senden, wenn Sie Ereignisse auf
stdout
oder empfangenstderr
).Synchron
Wenn Sie möchten, dass der Knoten seine Arbeit beendet und wartet, bis das Skript abgeschlossen ist , können Sie die synchrone Version verwenden:
child_process.spawnSync (...); (Knoten v0.11.12 +)
Probleme mit dieser Methode:
Wie man es benutzt:
quelle
child.stdout.setEncoding('utf8')
wenn Sie möchten, dass utf8-Zeichenfolgenstdout
asynchron benötigen, dh während das verbleibende Programm fortgesetzt wird, wenn der Prozess fortgesetzt wird.console.log("Output 1"); console.error("Boom"); console.log("Output 2");
und ich machespawnAsync('node ./script.js')
... wie behalten Sie die Reihenfolge der Ausgabe bei? Meine Ausgabe scheint immer in der falschen Reihenfolge zu erscheinen.pipe
oderpipeline
oder in den entsprechenden Optionen übergebenspawn
.Hier ist der sauberste Ansatz, den ich gefunden habe:
quelle
Ich hatte ein kleines Problem damit, die Protokollausgabe des Befehls "npm install" zu erhalten, als ich npm in einem untergeordneten Prozess erzeugt habe. Die Echtzeitprotokollierung von Abhängigkeiten wurde in der übergeordneten Konsole nicht angezeigt.
Der einfachste Weg, um das zu tun, was das Originalposter will, scheint folgender zu sein (npm unter Windows erzeugen und alles in der übergeordneten Konsole protokollieren):
quelle
Ich benötigte diese Funktionalität oft genug, um sie in eine Bibliothek namens std-pour zu packen . Sie sollten damit einen Befehl ausführen und die Ausgabe in Echtzeit anzeigen können. Einfach zu installieren:
Dann ist es einfach genug, einen Befehl auszuführen und die Ausgabe in Echtzeit zu sehen:
Es ist versprochen, so dass Sie mehrere Befehle verketten können. Es ist sogar mit der Signatur kompatibel,
child_process.spawn
sodass es überall dort, wo Sie es verwenden, weniger Ersatz sein sollte.quelle
Kind:
Elternteil:
quelle
PHP-ähnlicher Durchgang
Verwendung
quelle
Das Hinzufügen einer Antwort im Zusammenhang mit,
child_process.exec
da auch ich Live-Feedback benötigt hatte und erst nach Abschluss des Skripts eine Antwort erhielt . Dies ergänzt auch meinen Kommentar zu der akzeptierten Antwort, aber da sie formatiert ist, wird sie etwas verständlicher und leichter zu lesen sein.Grundsätzlich habe ich ein npm-Skript, das Gulp aufruft und eine Aufgabe aufruft, mit der anschließend
child_process.exec
je nach Betriebssystem ein Bash- oder Batch-Skript ausgeführt wird. Jedes Skript führt einen Erstellungsprozess über Gulp aus und ruft dann einige Binärdateien auf, die mit der Gulp-Ausgabe funktionieren.Es ist genau wie bei den anderen (Spawn usw.), aber der Vollständigkeit halber ist hier genau zu sehen, wie es geht:
Jetzt ist es so einfach wie das Hinzufügen eines Ereignis-Listeners. Für
stdout
:Und für
stderr
:Gar nicht so schlecht - HTH
quelle