Mam skrypt, który wysyła „cześć”, śpi na sekundę, wysyła „cześć”, śpi na 1 sekundę i tak dalej i tak dalej. Teraz pomyślałem, że będę mógł rozwiązać ten problem za pomocą tego modelu.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Teraz problem polega na tym, że zadanie musi zostać zakończone, aby dane wyjściowe zostały wyświetlone. Jak rozumiem, wynika to z faktu, że nowo utworzony proces przejmuje kontrolę nad wykonaniem. Oczywiście node.js nie obsługuje wątków, więc jakieś rozwiązania? Mój pomysł polegał na tym, aby ewentualnie uruchomić dwie instancje, pierwszą w określonym celu tworzenia zadania i skierować dane wyjściowe do procesu drugiej instancji, biorąc pod uwagę, że można to osiągnąć.
node.js
spawn
capture-output
foklepoint
źródło
źródło
python
, nie zapomnij przekazać-u
flagi, aby nie buforował wyjścia konsoli, w przeciwnym razie będzie wyglądać tak, jakby skrypt nie byłOdpowiedzi:
Wciąż jestem mokry w Node.js, ale mam kilka pomysłów. po pierwsze, uważam, że
execFile
zamiastspawn
;execFile
dotyczy sytuacji, gdy masz ścieżkę do skryptu, podczas gdyspawn
służy do wykonywania dobrze znanego polecenia, które Node.js może rozwiązać na ścieżce systemowej.1. Podaj wywołanie zwrotne w celu przetworzenia buforowanego wyjścia:
2. Dodaj odbiornik do strumienia wyjściowego procesu podrzędnego ( 9thport.net )
Co więcej, wydaje się, że istnieją opcje, dzięki którym można odłączyć spawnowany proces od terminala sterującego Node, co pozwoliłoby mu działać asynchronicznie. Nie testowałem tego jeszcze, ale w dokumentacji API są przykłady, które wyglądają mniej więcej tak:
źródło
child.spawn()
zshell
opcją ustawioną natrue
. 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! } );
Teraz jest o wiele łatwiej (6 lat później)!
Spawn zwraca obiekt childObject , za pomocą którego można następnie nasłuchiwać zdarzeń . Wydarzenia to:
Istnieje również kilka obiektów z childObject , są to:
Zobacz więcej informacji na temat childObject: https://nodejs.org/api/child_process.html
Asynchroniczny
Jeśli chcesz uruchomić proces w tle, gdy węzeł nadal może działać, użyj metody asynchronicznej. Nadal możesz zdecydować się na wykonywanie akcji po zakończeniu procesu i gdy proces ma jakiekolwiek dane wyjściowe (na przykład, jeśli chcesz wysłać dane wyjściowe skryptu do klienta).
child_process.spawn (...); (Węzeł v0.1.90)
Oto jak użyłbyś metody callback + asynchronicznej :
Korzystając z powyższej metody, możesz wysłać każdy wiersz danych wyjściowych ze skryptu do klienta (na przykład za pomocą Socket.io do wysłania każdego wiersza, gdy otrzymujesz zdarzenia na
stdout
lubstderr
).Synchroniczny
Jeśli chcesz, aby węzeł zatrzymał to, co robi i poczekał, aż skrypt się zakończy , możesz użyć wersji synchronicznej:
child_process.spawnSync (...);(Węzeł v0.11.12 +)
Problemy z tą metodą:
Jak tego użyć:
źródło
child.stdout.setEncoding('utf8')
jeśli chcesz, aby pojawiły się struny utf8.stdout
asynchronicznie, to znaczy, gdy pozostały program kontynuuje, jeśli proces jest kontynuowany.console.log("Output 1"); console.error("Boom"); console.log("Output 2");
a ja robięspawnAsync('node ./script.js')
... jak zachowujesz kolejność wyników? Wydaje się, że moje wyniki zawsze pojawiają się w niewłaściwej kolejności.pipe
lubpipeline
lub przechodzą w odpowiednich opcji dospawn
.Oto najczystsze podejście, jakie znalazłem:
źródło
Miałem mały problem z uzyskaniem danych wyjściowych rejestrowania z polecenia „npm install”, gdy utworzyłem npm w procesie potomnym. Rejestrowanie zależności w czasie rzeczywistym nie było wyświetlane w konsoli nadrzędnej.
Najprostszym sposobem zrobienia tego, czego chce oryginalny plakat, wydaje się być to (odradzaj npm w systemie Windows i loguj wszystko do konsoli nadrzędnej):
źródło
Zauważyłem, że wymagam tej funkcji na tyle często, że spakowałem ją do biblioteki o nazwie std-pour . Powinien umożliwiać wykonanie polecenia i przeglądanie wyników w czasie rzeczywistym. Aby zainstalować po prostu:
Wtedy wystarczy wykonać polecenie i zobaczyć wynik w czasie rzeczywistym:
Jest oparty na obietnicy, dzięki czemu możesz łączyć wiele poleceń. Jest nawet zgodny z sygnaturą funkcji,
child_process.spawn
więc powinien być zamiennikiem wszędzie tam, gdzie go używasz.źródło
dziecko:
rodzic:
źródło
Passthru podobne do PHP
Stosowanie
źródło
Dodanie odpowiedzi związanej z
child_process.exec
jak ja również, potrzebowało informacji zwrotnej na żywo i nie otrzymałem żadnej przed zakończeniem scenariusza. To również uzupełnia mój komentarz do zaakceptowanej odpowiedzi, ale sformatowany będzie nieco bardziej zrozumiały i łatwiejszy do odczytania.Zasadniczo mam skrypt npm, który wywołuje Gulp, wywołując zadanie, które następnie używa
child_process.exec
do wykonania skryptu bash lub wsadowego w zależności od systemu operacyjnego. Każdy skrypt uruchamia proces kompilacji za pośrednictwem Gulp, a następnie wykonuje wywołania niektórych plików binarnych, które współpracują z wyjściem Gulp.Jest dokładnie tak samo jak inne (spawn itp.), Ale ze względu na ukończenie, oto dokładnie, jak to zrobić:
Teraz jest to tak proste, jak dodanie detektora zdarzeń. Dla
stdout
:I dla
stderr
:Wcale nieźle - HTH
źródło