Дочерний процесс узла, канал закрыт на process.send

Внутри моего рабочего файла я слушаю обратный вызов данных. someLib — это последовательный порт узла.

process.on('message', function(msg) {
    someLib.on('data', function(data){
        console.log('some data');
        process.send(data);
    });
});

Это печатает

some data
Error: channel closed

Но

process.on('message', function(msg) {
    process.send('foobar');
});

работает отлично. Странно, но иногда первый пример кода работает, поэтому ошибка закрытия канала появляется случайным образом.

От http://nodejs.org/api/child_process.html#child_process_event_error я получаю информация о том, что ошибка возникает, когда

Sending a message to the child process failed for whatever reason.

Что такое "по любой причине"? Любые идеи?


person Upvote    schedule 08.06.2014    source источник


Ответы (2)


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

Я подключился к SIGHUP и изящно убил их. Теперь все работает.

person Upvote    schedule 09.06.2014

Вам нужно указать тип события, так как с process.send(data) вы просто отправляете объект.

person Pio    schedule 08.06.2014
comment
Какой тип? Согласно nodejs.org/api/ не обязательно указывать тип - person Upvote; 09.06.2014
comment
Да, но в своем коде вы регистрируете прослушиватель событий каждый раз при получении сообщения. Я думаю, вы хотите вызвать функцию там. Поэтому вместо someLib... просто вызовите функцию напрямую, как process.send(data). Или вы можете сделать что-то чуть ниже того места, на которое вы мне указали. - person Pio; 09.06.2014
comment
Извините, вы меня неправильно поняли, someLib.on вызывается один раз, мой код был просто короткой версией. Я отредактировал свой вопрос. - person Upvote; 09.06.2014
comment
Хорошо, теперь это имеет смысл. Я предполагаю, что проблема где-то в someLib. - person Pio; 09.06.2014
comment
Должно быть, хотелось бы узнать. - person Upvote; 09.06.2014