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);
        })
    );