Node.js 从代码执行shell脚本

Node.js 从代码执行shell脚本,node.js,shell,child-process,Node.js,Shell,Child Process,我正在尝试从nodejs代码执行一个shell脚本 //test.sh wget http://nodejs.org/dist/v0.10.26/node-v0.10.26-linux-x64.tar.gz tar -zxvf node-v0.10.26-linux-x64.tar.gz mv node-v0.10.26-linux-x64 node-v0.10.26 sudo cp -r node-v0.10.26 /usr/local/src //app.js var exec = req

我正在尝试从nodejs代码执行一个shell脚本

//test.sh
wget http://nodejs.org/dist/v0.10.26/node-v0.10.26-linux-x64.tar.gz
tar -zxvf node-v0.10.26-linux-x64.tar.gz
mv node-v0.10.26-linux-x64 node-v0.10.26
sudo cp -r node-v0.10.26 /usr/local/src

//app.js
var exec = require('child_process').exec;
 var execProcess = require("./exec_process.js");
execProcess.result("sh test.sh", function(err, response){
    if(!err){
        console.log(response);
    }else {
        console.log(err);
    }
});

//exec_process.js
 var exec = require('child_process').exec;

var result = function(command, cb){
    var child = exec(command, function(err, stdout, stderr){
        if(err != null){
            return cb(new Error(err), null);
        }else if(typeof(stderr) != "string"){
            return cb(new Error(stderr), null);
        }else{
            return cb(null, stdout);
        }
    });
}

exports.result = result;

执行app.js后,我无法看到任何响应。我做错了什么?

代码对我来说完美无瑕,没有任何更改。当你说你看不到任何回应时,这个过程是否挂起?最后的结果是什么?我怀疑脚本中的sudo命令会导致一些问题。你能消除这一点并改变吗?我没有sudo访问权限,因此在提示时失败

    bash-4.1$ node app.js
[sudo] password for gireesh:
[sudo] password for gireesh:
[sudo] password for gireesh:
[Error: Error: Command failed: /bin/sh -c sh test.sh
--2016-04-27 08:28:01--  http://nodejs.org/dist/v0.10.26/node-v0.10.26-linux-x64.tar.gz
Resolving nodejs.org... 104.20.22.46, 104.20.23.46, 2400:cb00:2048:1::6814:172e, ...
Connecting to nodejs.org|104.20.22.46|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5314716 (5.1M) [application/octet-stream]
Saving to: ânode-v0.10.26-linux-x64.tar.gz.2â
一些诊断步骤:

  • 在EXEC调用后打印子对象。这将打印与子进程相关的进程信息。这将确保孩子已经启动
  • 安装子终止回调,并在其中打印调试信息。这将确保孩子结束
  • 如果问题仍然存在,请安装子流挂钩。这将确保流中的即时打印立即输出,而不是在最后输出
修改的exec_process.js

var exec = require('child_process').exec;
var result = function(command, cb){
    var child = exec(command, function(err, stdout, stderr){
        if(err != null){
            return cb(new Error(err), null);
        }else if(typeof(stderr) != "string"){
            return cb(new Error(stderr), null);
        }else{
            return cb(null, stdout);
        }
    });
    console.log(child);
    child.on('close', function(code) {
      console.log('child ended with: ' + code);
    });
    child.on('error', function(err) {
      console.log('child errd with: ' + err);
    });
    child.stdout.on('data', function(d) {
      console.log('child stdout: ' + d);
   });
}
exports.result = result;
希望这有帮助。

试试这个

// app.js
require('child_process').spawn('sh', ['test.sh'], {stdio: 'inherit'});

app.js中的exec变量是您的子进程实例吗?我使用spawn方法。如果您想看到一些响应,那么您应该向控制台发送一些内容。您是否尝试过将
sh test.sh
放在相对于工作目录的路径上。还要检查您的执行权限。sh test.sh正在为mesweet和simple工作