Подтвердить что ты не робот

NodeJs выполняет команду в фоновом режиме и забывает

У меня есть бесконечный цикл NodeJS script.js, и мне нужен этот script для выполнения другого script в фоновом режиме как службы, которая фактически является службой WebSocket.

var exec = require('child_process').exec;
exec('node bgService.js &');

Итак, теперь оба скрипта работают нормально!

Когда я делаю Ctrl+C на моем script.js, bgService.js script также удаляется из памяти, которую я не хочу.

Как запустить что-то в фоновом режиме и забыть?

4b9b3361

Ответ 1

Вы можете сделать это, используя child_process.spawn с опцией detached:

var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
    detached: true
});

Это сделает дочерний процесс лидером новой группы процессов, поэтому он продолжит работу после выхода родительского процесса.

Но по умолчанию родительский процесс будет ждать выхода дочернего ребенка, и он также будет слушать его stdio. Чтобы полностью отсоединить дочерний процесс от родителя, вы должны:

  • отсоединить дочерний элемент stdio от родительского процесса, связать его с файлом или с /dev/null
  • удалить дочерний процесс из подсчета ссылок родительского цикла событий с помощью метода unref()

Вот пример этого:

var spawn = require('child_process').spawn;
spawn('node', ['bgService.js'], {
    stdio: 'ignore', // piping all stdio to /dev/null
    detached: true
}).unref();

Если вы не хотите потерять дочерний stdin вывод, вы можете передать его в какой-то файл журнала:

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

spawn('node', ['bgService.js'], {
    stdio: [ 'ignore', out, err ], // piping stdout and stderr to out.log
    detached: true
}).unref();

Для получения дополнительной информации см. child_process.spawn документация