nodejs 调用系统命令/shell文件/可执行文件
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);
})
);