Mam ten prosty skrypt:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
gdzie po prostu wykonuję polecenie skompilowania pliku skryptu kawy. Ale standardowe wyjście nigdy nie jest wyświetlane w konsoli, ponieważ polecenie nigdy się nie kończy (z powodu opcji -w kawy). Jeśli wykonam polecenie bezpośrednio z konsoli, otrzymam następujący komunikat:
18:05:59 - compiled my_file.coffee
Moje pytanie brzmi: czy możliwe jest wyświetlanie tych komunikatów za pomocą exec node.js? Jeśli tak jak? !
Dzięki
node.js
coffeescript
mravey
źródło
źródło
Odpowiedzi:
Nie używać
exec
. Użyj,spawn
który jestEventEmmiter
przedmiotem. Następnie możesz słuchaćstdout
/stderr
events (spawn.stdout.on('data',callback..)
), gdy się zdarzają .Z dokumentacji NodeJS:
exec
buforuje dane wyjściowe i zwykle zwraca je po zakończeniu wykonywania polecenia.źródło
flush(stdout);
w C), aby uruchomić zdarzenia w Node.js.exec
zwróci również obiekt ChildProcess, który jest EventEmitter.LUB
pipe
stdout procesu potomnego do stdout głównego.LUB odziedzicz stdio za pomocą spawn
źródło
pipe
:coffeeProcess.stdout.pipe(process.stdout);
spawn(cmd, argv, { stdio: 'inherit' })
. Zobacz nodejs.org/api/child_process.html#child_process_options_stdio dla różnych przykładów.spawn
zstdio: 'inherit'
. Daje bardziej dokładny wynik niżexec
i przesyłaniestdout
/stderr
, na przykład podczas wyświetlania informacji o postępie zgit clone
.Istnieje już kilka odpowiedzi, jednak żadna z nich nie wspomina o najlepszym (i najłatwiejszym) sposobie zrobienia tego, który jest przy użyciu
spawn
i{ stdio: 'inherit' }
opcji . Wydaje się, że daje najdokładniejsze wyjście, na przykład podczas wyświetlania informacji o postępie zgit clone
.Po prostu zrób to:
Podziękowania dla @MorganTouvereyQuilling za wskazanie tego w tym komentarzu .
źródło
stdio: "inherit"
zachowuje to formatowanie, podczas gdychild.stdout.pipe(process.stdout)
nie.Chciałbym tylko dodać, że jednym małym problemem z wyprowadzaniem ciągów buforów z odrodzonego procesu
console.log()
jest to, że dodaje on nowe linie, które mogą rozłożyć wyniki odrodzonego procesu na dodatkowe linie. Jeśli wyjściestdout
lubstderr
zeprocess.stdout.write()
zamiastconsole.log()
Pokochasz więc uzyskać wyjścia konsoli z zrodził proces „jak jest”.Widziałem to rozwiązanie tutaj: Node.js: drukowanie na konsoli bez końca nowej linii?
Mam nadzieję, że pomoże to komuś, kto użyje powyższego rozwiązania (które świetnie nadaje się do transmisji na żywo, nawet jeśli pochodzi z dokumentacji).
źródło
spawn(command, args, { stdio: 'inherit' })
, zgodnie z sugestią @MorganTouvereyQuilling tutaj stackoverflow.com/questions/10232192/...Zainspirowany odpowiedzią Nathanael Smith i komentarzem Erica Freese'a może być tak prosty, jak:
źródło
ls
, ale nie w przypadku bardziej złożonych poleceń, takich jaknpm install
. Próbowałem nawet potokować stdout i stderr do odpowiednich obiektów procesu.spawn(command, args, { stdio: 'inherit' })
, jak sugerowano tutaj stackoverflow.com/questions/10232192/…Przydało mi się dodanie niestandardowego skryptu exec do moich narzędzi, które to robią.
utilities.js
app.js
źródło
Po przejrzeniu wszystkich pozostałych odpowiedzi otrzymałem:
Czasami
data
będzie wiele linii, więcoldSchoolMakeBuild
nagłówek pojawi się raz dla wielu linii. Ale to mi nie przeszkadzało, żeby to zmienić.źródło
child_process.spawn zwraca obiekt ze strumieniami stdout i stderr. Możesz dotknąć strumienia standardowego, aby odczytać dane, które proces potomny odsyła z powrotem do Węzła. stdout będący strumieniem ma „dane”, „koniec” i inne zdarzenia, które mają strumienie. spawn najlepiej przydaje się, gdy chcesz, aby proces potomny zwrócił dużą ilość danych do węzła - przetwarzanie obrazu, odczyt danych binarnych itp.
abyś mógł rozwiązać swój problem za pomocą child_process.spawn, jak opisano poniżej.
źródło
Oto asynchroniczna funkcja pomocnicza napisana w pismach maszynowych, która wydaje mi się wystarczająca. Myślę, że to nie zadziała w przypadku długotrwałych procesów, ale nadal może być przydatne dla kogoś?
źródło