У меня есть дочерний процесс порождения узла, который непрерывно записывает в файл с использованием 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, даже если это отдельный дочерний процесс? Как дочерний процесс порождения может работать независимо от родительского процесса?
Пожалуйста, дайте мне знать ваши предложения об этом подходе или причину ошибки.
Заранее спасибо.