Как отсоединить дочерний дочерний процесс в Node.js script? - программирование
Подтвердить что ты не робот

Как отсоединить дочерний дочерний процесс в Node.js script?

Назначение: вызов внешнего приложения с указанными аргументами и выход из script.

Следующий script не работает так:

 #!/usr/bin/node
 var cp = require('child_process');
 var MANFILE='ALengthyNodeManual.pdf';
 cp.spawn('gnome-open', ['\''+MANFILE+'\''], {detached: true});

Проверенные вещи: exec - не отсоединяется. Большое спасибо заранее

4b9b3361

Ответ 1

Из node.js документации:

По умолчанию родитель будет ждать выхода отдельного ребенка. Чтобы родитель не ожидал получения определенного дочернего элемента, используйте метод child.unref(), а родительский цикл события не будет включать дочерний элемент в его счетчик ссылок.

При использовании отключенной опции, чтобы начать длительный процесс, этот процесс не будет работать в фоновом режиме, если он не содержит конфигурацию stdio, которая не связана с родителем. Если родительский stdio наследуется, дочерний элемент останется прикрепленным к управляющему терминалу.

Вам нужно изменить код следующим образом:

#!/usr/bin/node
var fs = require('fs');
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');

var cp = require('child_process');
var MANFILE='ALengthyNodeManual.pdf';
var child = cp.spawn('gnome-open', [MANFILE], { detached: true, stdio: [ 'ignore', out, err ] });
child.unref();

Ответ 2

Мое решение этой проблемы:

app.js

require('./spawn.js')('node worker.js');

spawn.js

module.exports = function( command ) {
    require('child_process').fork('./spawner.js', [command]); 
};

spawner.js

require('child_process').exec(
    'start cmd.exe @cmd /k "' + process.argv[2] + '"', 
    function(){}
);
process.abort(0);