2016-05-25 3 views
0

Я действительно смущен этим и изо всех сил пытался найти решение в течение нескольких месяцев. Я на OSX.родительский процесс убивает дочерний процесс, хотя отдельный отредактирован как истинный

Я слышал, что с использованием child_process.spawn с отключенной опцией, установленной в true, начнется дочерний процесс как лидер новой группы процессов, и если родительский элемент завершит работу, дочерний процесс может продолжить работу. Однако я никогда не видел никаких доказательств этого.

https://nodejs.org/api/child_process.html

Например:

const n = cp.spawn('node', ['watch-transpile.js'], { 
    detached: true, 
    stdio: ['ignore'] 
}); 

выше выполняется родителем, и если мы запустим $ ps aux | grep node

мы получаем:

Olegzandr  2546 0.0 0.2 3048544 19564 ?? Ss 11:29PM 0:00.09 node lib/transpile/watch-transpile.js 

Olegzandr  2541 0.0 0.7 3115684 60216 s000 S+ 11:29PM 0:01.47 node index -t -a -w 

Но когда я убью родительский элемент с control-c, дочерний процесс умирает, а также Родитель.

Как я могу создать фоновый процесс, который не зависит от родительского процесса с узлом? это убивает меня!

ответ

2

Aha! Конечно. Эти глупые документы Node!

Это работает.

 const n = cp.spawn('node', ['lib/transpile/watch-transpile.js'], { 
      detached: true, 
      stdio: ['ignore', 'ignore', 'ignore'] 
     }); 

Вы явно игнорируете каждый поток stdio, не просто используя «игнорировать» один раз; документы не упоминают об этом напрямую, но это имеет смысл, учитывая, что свойство stdio является массивом.

Смотрите этот вопрос на Github: https://github.com/nodejs/node/issues/7269#issuecomment-225698625

2

Попробуйте включить метод child.unref().

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

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

Пример затянувшийся процесс, путем выдергивания, а также игнорирование его родительских дескрипторов STDIO файлов, для того, чтобы игнорировать прекращение родителя:

Пример:

const n = cp.spawn('node', ['watch-transpile.js'], { 
    detached: true, 
    stdio: ['ignore'] 
}).unref(); 

Примеры (из документации):

const spawn = require('child_process').spawn; 

const child = spawn(process.argv[0], ['child_program.js'], { 
    detached: true, 
    stdio: ['ignore'] 
}); 

child.unref(); 

В качестве альтернативы можно перенаправить вывод дочернего процесса в файлы:

const fs = require('fs'); 
const spawn = require('child_process').spawn; 
const out = fs.openSync('./out.log', 'a'); 
const err = fs.openSync('./out.log', 'a'); 

const child = spawn('prg', [], { 
detached: true, 
stdio: [ 'ignore', out, err ] 
}); 

child.unref(); 
+0

спасибо, я попытался это тоже и это не сработало, но будет продолжать пытаться ... –

+0

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

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