Зараз набагато простіше (через 6 років)!
Spawn повертає дочірній об’єкт , з яким потім можна слухати події . Події:
- Клас: ChildProcess
- Подія: "помилка"
- Подія: "вихід"
- Подія: "закрити"
- Подія: "відключити"
- Подія: 'повідомлення'
Також є купа об’єктів від childObject , це:
- Клас: ChildProcess
- дитина.стдін
- child.stdout
- child.stderr
- дитина.stdio
- child.pid
- дитина.пов’язаний
- child.kill ([сигнал])
- child.send (повідомлення [, sendHandle] [, зворотний дзвінок])
- child.disconnect ()
Докладнішу інформацію про childObject див. Тут: https://nodejs.org/api/child_process.html
Асинхронний
Якщо ви хочете запустити процес у фоновому режимі, поки вузол все ще може продовжувати виконувати, скористайтеся асинхронним методом. Ви все ще можете вибрати виконання дій після того, як процес завершиться, і коли у нього буде якийсь результат (наприклад, якщо ви хочете надіслати вихідному сценарію клієнту).
child_process.spawn (...); (Вузол v0.1.90)
var spawn = require('child_process').spawn;
var child = spawn('node ./commands/server.js');
// You can also use a variable to save the output
// for when the script closes later
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
//Here is where the output goes
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
//Here is where the error output goes
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
//Here you can get the exit code of the script
console.log('closing code: ' + code);
console.log('Full output of script: ',scriptOutput);
});
Ось як би ви використовували метод зворотного дзвінка + асинхронний :
var child_process = require('child_process');
console.log("Node Version: ", process.version);
run_script("ls", ["-l", "/home"], function(output, exit_code) {
console.log("Process Finished.");
console.log('closing code: ' + exit_code);
console.log('Full output of script: ',output);
});
console.log ("Continuing to do node things while the process runs at the same time...");
// This function will output the lines from the script
// AS is runs, AND will return the full combined output
// as well as exit code when it's done (using the callback).
function run_script(command, args, callback) {
console.log("Starting Process.");
var child = child_process.spawn(command, args);
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
callback(scriptOutput,code);
});
}
Використовуючи вищевказаний метод, ви можете надіслати клієнту кожен рядок виводу зі сценарію (наприклад, використовуючи Socket.io для надсилання кожного рядка, коли ви отримуєте події на stdout
або stderr
).
Синхронний
Якщо ви хочете, щоб вузол зупинив те, що він робить, і чекати, поки скрипт завершиться , ви можете використовувати синхронну версію:
child_process.spawnSync (...);(Вузол v0.11.12 +)
Проблеми з цим методом:
- Якщо сценарій потребує певного часу, то ваш сервер буде зависнути протягом такої кількості часу!
- Версія stdout буде повернута лише після завершення запуску сценарію . Оскільки це синхронно, він не може продовжуватись, поки поточний рядок не закінчиться. Тому він не в змозі зафіксувати подію "stdout" до тих пір, поки лінія нересту не закінчиться.
Як ним користуватися:
var child_process = require('child_process');
var child = child_process.spawnSync("ls", ["-l", "/home"], { encoding : 'utf8' });
console.log("Process finished.");
if(child.error) {
console.log("ERROR: ",child.error);
}
console.log("stdout: ",child.stdout);
console.log("stderr: ",child.stderr);
console.log("exist code: ",child.status);
python
тоді не забудьте поставити-u
прапор, щоб він не забудовував вихід консолі, інакше це буде виглядати так, що сценарій не живе stackoverflow.com/a/49947671/906265