Не могу убить приложение NodeJS

Однажды ни с того ни с сего мое приложение решило не умирать.

После нажатия ctrl + c, когда я проверяю порт, он все еще там, и не только на моей машине, но и на сервере, которым управляет PM2, поэтому мне нужно каждый раз заходить туда и убивать процесс вручную. Я пытался искать проблемы в своем коде, и когда я не мог, я просто думал, что это просто одна из ошибок зависимостей, и скоро будет исправление. Это немного раздражало, но я мог убить процесс с помощью kill -9 PID, и у меня было большинство задач, которые у меня были на интерфейсной стороне, так что это не было большой проблемой. Сегодня, более чем через неделю, проблема все еще здесь. Я вернулся в историю, выбрал коммит, сделанный несколько недель назад, где все работало отлично, переключил NodeJS с 5.1.0 на 4.2.1, очистил кеш npm, переустановил все зависимости и все еще вижу проблему. Я использую LoopbackJS, но обычно я запускаю приложение просто с помощью «node server/server.js», и тогда возникает проблема, описанная выше, но если я использую «slc run», а затем пытаюсь убить приложение с помощью ctrl + c это просто зависает навсегда, я имею в виду, что я могу нажимать ctrl + c столько раз, сколько захочу, и он все еще работает на переднем плане консоли.

Если вместо нажатия ctrl+c я убиваю вкладку в консоли, приложение умирает без проблем.

Это то, что я вижу после запуска «lsof -i tcp: 4000», когда приложение должно быть мертво, но не

lsof -i TCP:4000

Редактировать: запуск и уничтожение его с помощью диспетчера процессов Strongloop - slc start/slc stop работает нормально, но было бы удобнее использовать обычный способ запуска приложения NodeJS (node ​​server.js) во время разработки, и это не меняет того факта, что есть есть какая-то проблема, и лучше бы ее не прятать под ковер.


person Paweł Wszoła    schedule 23.11.2015    source источник
comment
Проблема возникает только при использовании slc run?   -  person Kevin B    schedule 23.11.2015
comment
Я отредактировал вопрос. Когда я пытаюсь убить его, когда он был запущен с помощью slc run, он просто зависает на переднем плане, и я могу нажимать столько клавиш ctrl+c, сколько захочу, но когда я запускаю его с узлом server/server.js, он остается в фоновом режиме.   -  person Paweł Wszoła    schedule 23.11.2015
comment
И возникает ли проблема, если закрыть его с помощью slc clusterctl stop? или slc ctl stop в новой версии? Я предполагаю, что он убивает контроллер кластера, но оставляет дочерние процессы запущенными.   -  person Kevin B    schedule 23.11.2015
comment
Обещай, что ничего не делаешь на process.on('SIGINT', ?   -  person Dan Crews    schedule 23.11.2015
comment
Я только что играл с slc ctl. После запуска slc start => slc ctl stop 1 это действительно работает, и приложение умирает без каких-либо проблем, и тогда я могу запустить его еще раз. Ницца! Но почему? Почему обычный способ запуска не работает?   -  person Paweł Wszoła    schedule 23.11.2015
comment
Дэн Крюс Я делаю только process.on('uncaughtException') для отправки некоторых журналов, но после того, как это будет сделано, я убью приложение с помощью process.exit(1); Во всяком случае, для отладки я удалил этот код.   -  person Paweł Wszoła    schedule 23.11.2015
comment
@PawełWszoła Понятия не имею. Это связано с тем, как контроллер кластера управляет дочерними процессами. Я бы предположил, что уничтожение контроллера с помощью Ctrl + C приводит к жесткому выходу, который не позволяет ему убивать дочерние процессы, поэтому они просто продолжают работать.   -  person Kevin B    schedule 24.11.2015


Ответы (1)


В гневе я убрал свое приложение до самых основных элементов. Файл за файлом, кусочек за кусочком, и я нашел ответ. Виновником был phantomJS — https://github.com/sgentle/phantomjs-node. Эта ошибка появилась в PATCH версии 0.8.2. Исправление было создано почти месяц назад, слито неделю назад, но еще не опубликовано на npm.

person Paweł Wszoła    schedule 24.11.2015