Saya memiliki skrip yang mengeluarkan 'hai', tidur sebentar, mengeluarkan 'hai', tidur selama 1 detik, dan seterusnya dan seterusnya. Sekarang saya pikir saya akan bisa mengatasi masalah ini dengan model ini.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Sekarang masalahnya adalah bahwa tugas tersebut harus diselesaikan agar keluarannya dapat ditampilkan. Seperti yang saya pahami, ini karena fakta bahwa proses yang baru muncul mengambil kendali eksekusi. Jelas node.js tidak mendukung utas jadi ada solusi? Ide saya adalah untuk menjalankan dua contoh, yang pertama untuk tujuan khusus membuat tugas dan membuatnya menyalurkan output ke proses contoh kedua, mengingat ini dapat dicapai.
node.js
spawn
capture-output
foklepoint.dll
sumber
sumber
python
maka jangan lupa untuk memberikan-u
bendera agar tidak menyangga keluaran konsol, jika tidak maka akan terlihat seperti skrip tidak live stackoverflow.com/a/49947671/906265Jawaban:
Saya masih merasa basah dengan Node.js, tapi saya punya beberapa ide. pertama, saya yakin Anda perlu menggunakan
execFile
alih-alihspawn
;execFile
adalah untuk saat Anda memiliki jalur ke skrip, sedangkanspawn
untuk menjalankan perintah terkenal yang dapat diselesaikan oleh Node.js di jalur sistem Anda.1. Sediakan callback untuk memproses keluaran yang di-buffer:
2. Tambahkan pendengar ke aliran stdout proses anak ( 9thport.net )
Selanjutnya, tampaknya ada opsi di mana Anda dapat melepaskan proses yang muncul dari terminal pengendali Node, yang akan memungkinkannya untuk berjalan secara asinkron. Saya belum mengujinya, tetapi ada contoh di dokumen API yang berjalan seperti ini:
sumber
child.spawn()
denganshell
opsi disetel ketrue
. 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! } );
Jauh lebih mudah sekarang (6 tahun kemudian)!
Spawn mengembalikan childObject , yang kemudian bisa Anda dengarkan kejadiannya . Acara-acara tersebut adalah:
Ada juga banyak objek dari childObject , yaitu:
Lihat informasi lebih lanjut di sini tentang childObject: https://nodejs.org/api/child_process.html
Asinkron
Jika Anda ingin menjalankan proses Anda di latar belakang sementara node masih dapat terus dijalankan, gunakan metode asynchronous. Anda masih dapat memilih untuk melakukan tindakan setelah proses Anda selesai, dan ketika proses tersebut memiliki keluaran (misalnya jika Anda ingin mengirim keluaran skrip ke klien).
child_process.spawn (...); (Node v0.1.90)
Inilah cara Anda menggunakan metode callback + asynchronous :
Dengan menggunakan metode di atas, Anda dapat mengirim setiap baris output dari skrip ke klien (misalnya menggunakan Socket.io untuk mengirim setiap baris saat Anda menerima acara pada
stdout
ataustderr
).Sinkronis
Jika Anda ingin node menghentikan apa yang dilakukannya dan menunggu hingga skrip selesai , Anda dapat menggunakan versi sinkron:
child_process.spawnSync (...); (Node v0.11.12 +)
Masalah dengan metode ini:
Bagaimana cara menggunakannya:
sumber
child.stdout.setEncoding('utf8')
jika Anda ingin string utf8 masuk.stdout
asynchronous, yaitu, sementara program lainnya berlanjut, jika proses berlanjut.console.log("Output 1"); console.error("Boom"); console.log("Output 2");
dan saya lakukanspawnAsync('node ./script.js')
... bagaimana Anda mempertahankan urutan keluaran? Keluaran saya sepertinya selalu keluar dengan urutan yang salah.pipe
ataupipeline
atau meneruskan opsi yang sesuai untukspawn
.Inilah pendekatan terbersih yang saya temukan:
sumber
Saya mengalami sedikit kesulitan mendapatkan keluaran logging dari perintah "npm install" ketika saya menelurkan npm dalam proses anak. Pencatatan log dependensi secara realtime tidak ditampilkan di konsol induk.
Cara termudah untuk melakukan apa yang diinginkan poster asli adalah seperti ini (menelurkan npm di windows dan mencatat semuanya ke konsol induk):
sumber
Saya mendapati diri saya membutuhkan fungsionalitas ini cukup sering sehingga saya mengemasnya ke dalam perpustakaan yang disebut std-pour . Ini harus memungkinkan Anda menjalankan perintah dan melihat output secara real time. Untuk menginstal secara sederhana:
Maka cukup sederhana untuk menjalankan perintah dan melihat hasilnya secara realtime:
Itu berdasarkan janji sehingga Anda dapat merangkai banyak perintah. Bahkan berfungsi dengan tanda tangan
child_process.spawn
sehingga harus menjadi pengganti di mana pun Anda menggunakannya.sumber
anak:
induk:
sumber
Passthru seperti PHP
Pemakaian
sumber
Menambahkan jawaban yang terkait dengan
child_process.exec
karena saya juga membutuhkan umpan balik langsung dan tidak mendapatkannya sampai skrip selesai. Ini juga melengkapi komentar saya untuk jawaban yang diterima, tetapi karena diformat, itu akan sedikit lebih dapat dimengerti dan lebih mudah dibaca.Pada dasarnya, saya memiliki skrip npm yang memanggil Gulp, menjalankan tugas yang kemudian digunakan
child_process.exec
untuk menjalankan skrip bash atau batch tergantung pada OS. Salah satu skrip menjalankan proses pembangunan melalui Gulp dan kemudian membuat beberapa panggilan ke beberapa binari yang bekerja dengan keluaran Gulp.Ini persis seperti yang lain (bertelur, dll.), Tetapi demi penyelesaian, berikut cara melakukannya:
Sekarang sesederhana menambahkan pendengar acara. Untuk
stdout
:Dan untuk
stderr
:Tidak terlalu buruk sama sekali - HTH
sumber