2016-04-26 8 views
3

Я пытаюсь выполнить скрипт из nodejs кодаВыполнение сценария оболочки из кода

//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, я не в состоянии видеть что-либо в ответ. Что я здесь делаю неправильно?

+0

является ехес переменным внутри вашего app.js вашего child_process экземпляра? Я использую метод spawn. Если вы хотите увидеть какой-то ответ, вы должны отправить что-то на консоль. – jmugz3

+0

Вы пытались вместо того, чтобы ставить 'sh test.sh' просто поместить свой путь относительно рабочего каталога. Также проверьте свои права на выполнение. – jmugz3

+0

** sh test.sh ** работает для меня – user4324324

ответ

1

Код работает для меня отлично, без каких-либо изменений. Когда вы говорите, что не можете увидеть какой-либо ответ, происходит ли процесс? каков конечный результат? Я сомневаюсь, что команда 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â 

Некоторые диагностические шаги:

  • Печать ребенок объект, после excec вызова. Это напечатает информацию о процессе, относящуюся к ребенку. Это позволит убедиться, что ребенок запущен.
  • Установите обратный вызов для терминатора-потомка и напечатайте в нем отладочную информацию. Это позволит убедиться, что ребенок окончен.
  • Если проблема по-прежнему сохраняется, установите крючки потокового потока. Это гарантирует, что мгновенные отпечатки в потоках выводятся немедленно, а не в конце.

Модифицированные 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; 

Надежда это помогает.

11

Попробуйте

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

его простой и работает для меня – MaxySpark

+0

сладкий и простой –

Смежные вопросы