Artık çok daha kolay (6 yıl sonra)!
Spawn , daha sonra olayları dinleyebileceğiniz bir childObject döndürür . Olaylar:
- Sınıf: ChildProcess
- Olay: 'hata'
- Etkinlik: 'çıkış'
- Olay: 'kapat'
- Olay: 'bağlantıyı kes'
- Olay: 'mesaj'
ChildObject'ten de bir sürü nesne var , bunlar:
- Sınıf: ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- child.connected
- child.kill ([sinyal])
- child.send (mesaj [, sendHandle] [, geri arama])
- child.disconnect ()
ChildObject hakkında daha fazla bilgiye buradan ulaşabilirsiniz: https://nodejs.org/api/child_process.html
eşzamanlı olmayan
İşleminizi, düğüm hala çalışmaya devam ederken arka planda çalıştırmak istiyorsanız, zaman uyumsuz yöntemi kullanın. İşleminiz tamamlandıktan sonra ve işlemin herhangi bir çıktısı olduğunda (örneğin, istemciye bir komut dosyasının çıktısını göndermek istiyorsanız) eylemleri gerçekleştirmeyi yine de seçebilirsiniz.
child_process.spawn (...); (Düğüm 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);
});
İşte sen asenkron yönteme + bir geri arama nasıl kullanacağını :
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);
});
}
Yukarıdaki yöntemi kullanarak, komut dosyasındaki her çıktı satırını istemciye gönderebilirsiniz (örneğin, stdout
veya üzerinde olay aldığınızda her satırı göndermek için Socket.io kullanarak stderr
).
Senkron
Düğümün yaptığı şeyi durdurmasını ve komut dosyası tamamlanana kadar beklemesini istiyorsanız, zaman uyumlu sürümü kullanabilirsiniz:
child_process.spawnSync (...); (Düğüm v0.11.12 +)
Bu yöntemle ilgili sorunlar:
- Komut dosyasının tamamlanması biraz zaman alırsa, sunucunuz bu süre boyunca askıda kalacaktır!
- Standart çıktı, yalnızca betik çalışması bittikten sonra döndürülür . Senkron olduğu için mevcut satır bitene kadar devam edemez. Bu nedenle, spawn hattı bitene kadar 'stdout' olayını yakalayamaz.
Bu nasıl kullanılır:
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
iletmeyi unutmayın-u
, aksi takdirde komut dosyası canlı stackoverflow.com/a/49947671/906265