Node.js: Как отменить отдельный ребенок на переднем плане и выйти

В соответствии с документами для child_process.spawn я ожидал, что смогу запустить дочерний процесс на переднем плане и позволить самому процессу узла child_process.spawn следующим образом:

handoff-exec.js:

'use strict';

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

// this console.log before the spawn seems to cause
// the child to exit immediately, but putting it
// afterwards seems to not affect it.
//console.log('hello');

var child = spawn(
  'ping'
, [ '-c', '3', 'google.com' ]
, { detached: true, stdio: 'inherit' }
);

child.unref();

Вместо того, чтобы видеть выходные данные команды ping, она просто завершается без каких-либо сообщений или ошибок.

node handoff-exec.js
hello
echo $?
0

Итак... возможно ли в node.js (или вообще) запустить дочерний объект на переднем плане при выходе из родительского процесса?

Багги Нод Версии

Я обнаружил, что удаление console.log('hello'); позволяет ребенку бежать, однако он все еще не передает контроль над stdin переднего плана ребенку. Это явно не предназначено, поэтому что-то должно быть глючит в версии узла, который я использовал в то время...

Ответ 1

Решение

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

'use strict';

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

console.log("Node says hello. Let see what ping has to say...");

var child = spawn(
  'ping'
, [ '-c', '3', 'google.com' ]
, { detached: true, stdio: 'inherit' }
);

child.unref();

Приведенный выше фрагмент кода будет работать так же, как если бы он был фоном оболочки:

ping -c 3 google.com &

Ответ 2

Вам не хватает

// Listen for any response:
child.stdout.on('data', function (data) {
    console.log(data.toString());
});

// Listen for any errors:
child.stderr.on('data', function (data) {
    console.log(data.toString());
}); 

и вам не нужен child.unref();