Почему дочерний процесс порождения узла отсоединяется от родительского процесса и запускается независимо? - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть дочерний процесс порождения узла, который непрерывно записывает в файл с использованием writestream при каждом полученном «событии данных». Скрипт запускается под ssh и сталкивается с проблемой крайнего случая.

Рассмотрим несколько терминалов, открытых с одним и тем же хостом ssh, и скрипт запускается в одном терминале. Кто-то случайно закрыл терминал ssh во время его выполнения и не хочет останавливать выполнение дочернего процесса. при использовании команды ps -ef | grep "имя команды" дочерний процесс, все еще работающий с другим идентификатором родительского процесса (он показывает 1), но записывающий поток в дочернем процессе прекращает запись в файл. Кажется, что дочерний процесс стал процессом зомби, хотя я отделил процесс от родителя. Вы можете найти скрипт ниже:

 var execSpawn = require('child_process').spawn;
var Promise = require('bluebird');

var spawnAction = function(path, cmd, cb){
    return function(resolve, reject, onCancel){
        cmdExec = execSpawn(path, cmd, {detached: true});
        //cmdExec = execSpawn(path, cmd, {detached: true}).unref();
        var fileData = {}
        var count = 0;
        var stream = fs.createWriteStream('filepath');
        cmdExec.stdout.setEncoding('utf8');
        cmdExec.stdout.on('data', function(data){
            //Certain actions with filedata and count;
            stream.write(data);
        });
        cmdExec.stderr.on('data', function(data){
            //some actions
            stream.write("error");
        });

        cmdExec.on('close', function(){
            stream.end();
                if(cb){
                   resolve(cb(fileData));
                }else{
                    resolve(count);
                }
        });
       }
    }

Этот сценарий работает правильно, если ему разрешено работать полностью без каких-либо перерывов Когда терминал выполнения скрипта закрывает дочерний процесс, он останавливает запись потока в файл. Если я пытаюсь использовать detach вместе с unref (), он выдает ошибку, как будто он не может определить событие stdout.on над дочерним процессом.

Cannot read property 'stdout' of undefined  

Дополнительная информация во время работы скрипта. Это взято на том же хосте в другом терминале

 ps -ef | grep command_name
root     19904 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdb
root     19905 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdc
root     19906 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdd
root     19907 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sde
root     23101 13105  0 20:16 pts/0    00:00:00 grep --color=auto command_name

После закрытия скрипта запущенный терминал до его завершения. Я получаю это:

ps -ef | grep command_name
root     19904     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdb
root     19905     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdc
root     19906     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdd
root     19907     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sde
root     23163 13105  0 20:16 pts/0    00:00:00 grep --color=auto command_name

Я пытаюсь выяснить, почему происходит эта проблема, и будут ли какие-либо возможные способы сделать это по-другому. Почему идентификатор родительского процесса изменился на 1, даже если это отдельный дочерний процесс? Как дочерний процесс порождения может работать независимо от родительского процесса?

Пожалуйста, дайте мне знать ваши предложения об этом подходе или причину ошибки.

Заранее спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Я думаю, вам не нужно отстранять своих детей. Дети порождаются асинхронно , поэтому вы можете манипулировать несколькими дочерними устройствами одновременно

...