Node и NPM Запуск скрипта и Ctrl-C запускают SIGINT дважды - PullRequest
0 голосов
/ 16 февраля 2019

Я столкнулся с проблемой в одном из моих приложений Nodejs, работающих с npm start (который просто node app.js).

Мое приложение содержит обработчик sigint следующим образом:

process.on('SIGINT', () => {
    db.disconnect().then({
        process.exit(0);
    }).catch(e => process.exit(1));
});

С соответствующими журналами.После некоторого тестирования других файлов, я заметил, что Ctrl-C в процессе npm запускает SIGINT дважды, если первый из них занимает слишком много времени для выхода.(попробуйте добавить тайм-аут в пример приложения).

На данный момент я добавил счетчик, чтобы проверить, выполняется ли вызов более одного раза, но я не уверен, что это «путь»Эта проблема.Я предполагаю, что SIGINT для процесса npm, как ожидается, завершится через определенный промежуток времени, поэтому npm передает его еще раз (всегда только дважды).

Кто-нибудь сталкивался с этой проблемой и нашел жизнеспособное решение?

Спасибо!

1 Ответ

0 голосов
/ 20 августа 2019

Предположим, что приведенный ниже код находится в файле с именем x.js .Предположим, что у вас есть скрипт npm start в файле package.json, который выполняет команду node x.js .

process.on("SIGINT", (signal) => {
    console.log(signal + " signal received.");
    process.exitCode = 0;
});

setTimeout(function() {
    console.log("Hello");
}, 5000);

Если мы выполняем кодс помощью команды node x.js код напечатает только 1 строку «Сигнал SIGINT получен».Однако, если мы запускаем код с помощью команды npm run start, код напечатает 2 строки «SIGINT signal receive».В дополнение к этому, если мы используем пакет npm nodemon для контроля нашего кода и выполняем код с помощью команды nodemon x.js, код также напечатает 2 строки «SIGINT signal receive».

Если бы мы использовали process.exit(0); вместо process.exitCode = 0;, мы бы заметили, что все вышеприведенные команды будут печатать только 1 строку «SIGINT signal receive» из-за принудительного выхода из процесса.

Это приводитМы обратимся к такой интерпретации, если мы не вызываем команду node напрямую и используем уровень, такой как npm и nodemon, для запуска команды node, в таких случаях уровень дважды передает сигнал SIGINT процессу узла.

Окружающая среда: macOS Mojave v10.14.6npm v6.10.0узел v12.7.0nodemon v1.18.11

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...