nodejs的child_process
模塊,官方文檔
異步加載
以下幾種方式都是異步加載
- child_process.exec(command[, options][, callback]) 啟動子進程來執行shell命令,可以通過回調參數來獲取腳本shell執行結果
- child_process.execfile(file[, args][, options][, callback])與exec類型不同的是,它執行的不是shell命令而是一個可執行文件
- child_process.spawn(command[, args][, options])僅僅執行一個shell命令,不需要獲取執行結果
- child_process.fork(modulePath[, args][, options])可以用node執行的.js文件,也不需要獲取執行結果。fork出來的子進程一定是node進程
沒驗證過 參考
exec()與execfile()在創建的時候可以指定timeout屬性設置超時時間,一旦超時會被殺死
如果使用execfile()執行可執行文件,那么頭部一定是#!/usr/bin/env node
調用shell文件要修改讀寫權限
// ******************系統命令******************
var spawn = require('child_process').spawn;
free = spawn('free', ['-m']);
// 捕獲標准輸出並將其打印到控制台
free.stdout.on('data', function (data) {
console.log('standard output:\n' + data);
});
// 捕獲標准錯誤輸出並將其打印到控制台
free.stderr.on('data', function (data) {
console.log('standard error output:\n' + data);
});
// 注冊子進程關閉事件
free.on('exit', function (code, signal) {
console.log('child process eixt ,exit:' + code);
});
// ******************系統命令******************
var exec = require('child_process').exec;
var cmdStr = "ls";
exec(cmdStr, function(err,stdout,stderr){
if(err) {
console.log('error:'+stderr);
} else {
console.log('args stdout:'+stdout);
}
});
//************* 調用shell文件 ************
// chmod 777
// shell.sh:
// #!/bin/sh
// echo "$(pwd)"
var execfile = require('child_process').exec;
execfile("./shell.sh",function(err, stdout,stderr){
if(err) {
console.log('error:'+stderr);
} else {
console.log('args stdout:'+stdout);
}
});
//************* 調用可執行文件 ************
var cp = require("child_process");
cp.execFile("colmap",["gui"],function(err,stdout,stderr){
if(err){
// console.error(err);
console.log('error:'+err);
}
console.log("stdout:",stdout)
console.log("stderr:",stderr);
});
同步加載
- execFileSync:調用方式和異步加載相同,但是返回值不同,返回的是
buffer/string
類型
console.log(
execfile.execFileSync("./scripts/shell.sh",["test"],{encoding: 'utf-8'},function(err,stdout,stderr){
if(err){
// console.error(err);
console.log('error:'+err);
}
console.log("stdout:",stdout);
console.log("stderr:",stderr);
})
);