Запуск дочерних процессов в облачном литейном node.js

Кто-нибудь пробовал запускать дочерние процессы в Cloud Foundry node.js?

У меня ниже код работает нормально локально:

var port = (process.env.VMC_APP_PORT || 3000),
    host = (process.env.VCAP_APP_HOST || 'localhost'),
    http = require('http');


 var childProcess = require('child_process'),
         phantom = require('phantomjs'),
     ls;

 http.createServer(function(req, res) {

    ls = childProcess.exec('phantomjs -h', function (error, stdout, stderr) {
    if (error) {
     console.log(error.stack);
     console.log('Error code: '+error.code);
     console.log('Signal received: '+error.signal);
    }
    console.log('Child Process STDOUT: '+stdout);
    console.log('Child Process STDERR: '+stderr);
    });

    ls.on('exit', function (code) {
        console.log('Child process exited with exit code '+code);
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.write('Working...');
      res.end();
    });

 }).listen(port, host);

Но vmc push на cloudfoundry.com у меня возникла ошибка в vmc logs

Reading logs/stdout.log... OK
Child process exited with exit code 127
Error: Command failed: /bin/sh: phantomjs: not found

    at ChildProcess.exithandler (child_process.js:536:15)
    at ChildProcess.EventEmitter.emit (events.js:91:17)
    at maybeClose (child_process.js:634:16)
    at Socket.ChildProcess.spawn.stdin (child_process.js:805:11)
    at Socket.EventEmitter.emit (events.js:88:17)
    at Socket._destroy.destroyed (net.js:358:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)
Error code: 127
Signal received: null
Child Process STDOUT:
Child Process STDERR: /bin/sh: phantomjs: not found

Child process exited with exit code 127
Error: Command failed: /bin/sh: phantomjs: not found

    at ChildProcess.exithandler (child_process.js:536:15)
    at ChildProcess.EventEmitter.emit (events.js:91:17)
    at maybeClose (child_process.js:634:16)
    at Socket.ChildProcess.spawn.stdin (child_process.js:805:11)
    at Socket.EventEmitter.emit (events.js:88:17)
    at Socket._destroy.destroyed (net.js:358:10)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)
Error code: 127
Signal received: null
Child Process STDOUT:
Child Process STDERR: /bin/sh: phantomjs: not found

Затем я также добавил файл package.json ниже и все та же ошибка:

{
  "name" : "mytestchildprocesses",
  "version" : "0.1.0",
  "dependencies" : {
    "phantomjs" : "1.8.1-3",
    "child_process" : "0.x.x",
    "http" : "0.0.0"
  }
}

В качестве альтернативы я попробовал кое-кого еще поработать над размещением фантомов на node.js: https://github.com/sgentle/phantomjs-node. Но эта опция не работает даже на моей локальной машине (не удалось вызвать phantomjs.cmd в Windows).

Я скорее понял, как выполнять дочерние процессы в cloudfoundry.com, если вы, ребята, можете помочь.

Очень ценю!!


person HP.    schedule 24.02.2013    source источник


Ответы (3)


Похоже, для Phantom.js требуется двоичный файл с именем «phamtom». Я бы посоветовал взглянуть на пакет node-fibers — https://github.com/laverdet/node-fibers. Эта библиотека не зависит от каких-либо собственных двоичных файлов и должна работать нормально.

person Dan Higham    schedule 26.02.2013
comment
Может быть, я что-то упускаю, но как помогают node-fibres? - person HP.; 26.02.2013
comment
Извините, может быть, я неправильно понял. Вы просто хотите иметь возможность запустить новый процесс в Node.js, верно? Если это так, вы можете легко добиться этого с помощью модуля node-fibres. - person Dan Higham; 27.02.2013
comment
Я думаю, что я медленный, но есть ли пример запуска нового процесса с узлами? github.com/laverdet/node-fibers - person HP.; 28.02.2013
comment
В README полно примеров. Fiber(function() { alert('hello'); }).run(); - person Dan Higham; 01.03.2013

Итак, я просто попробовал ваш код локально и у меня возникли проблемы.

С этим package.json npm install выдает ошибку о том, что child_process не существует в репозитории npm. Удаление этой строки позволяет завершить установку npm.

Затем я получаю ошибки о том, что фантомы не исполняются на пути.

Если я устанавливаю phantomjs глобально, я вижу ошибку о неверных аргументах для phantomjs на консоли узла, когда я нажимаю localhost: 3000

Я не удивлен, что у него есть проблемы, загруженные в Cloud Foundry, поскольку для этого определенно потребуется действительный package.json, чтобы включить удаленную установку соответствующих модулей узла, и если он полагается на глобальную установку, у него также будут проблемы.

person Andy Piper    schedule 24.02.2013
comment
phantomjs можно установить локально или глобально, но PATH (для Windows) должен указывать на phantomjs.bat (или .cmd). В этом случае возникает вопрос: как правильно выполнить дочерний процесс, когда зависимость также должна быть загружена? - person HP.; 25.02.2013

Убедитесь, что 'phantomjs' указан в вашем package.json как зависимость (не путать с пакетом 'phantom').

Оттуда вы можете получить двоичный путь к исполняемому файлу фантома, используя следующий фрагмент. Пакет phantomjs гарантирует, что пакет phantom установлен в системе. Это работает и на облачном литейном производстве.

var phantomjs = require('phantomjs')
var binPath = phantomjs.path
ls = childProcess.exec(binPath + ' -h' //.etc etc
person mweststrate    schedule 09.12.2014