как остановить скрипт node js
О завершении работы Node.js-процессов
Существует несколько способов намеренного завершения работы процесса. Среди них — следующие:
Операция | Пример |
Ручной выход из процесса | |
Неперехваченная ошибка | |
Необработанное отклонение промиса | |
Проигнорированное событие error | |
Необработанный сигнал |
Ручной выход из процесса
Этот Node.js-однострочник ничего в консоль не выведет. Правда, воспользовавшись возможностями командной оболочки, можно узнать статус завершения процесса. Пользователь программы, столкнувшись с тем, что она завершила работу подобным образом, не поймёт того, что произошло.
Теперь пользователю будут понятны причины остановки приложения. Пользователь запускает приложение, оно выдаёт ошибку в консоль, после чего пользователь принимает меры для исправления ситуации.
Стоит отметить, что метод process.exit() — это весьма мощный механизм. Хотя у него есть своё место в коде приложений, его категорически не рекомендуется использовать в библиотеках, рассчитанных на многократное использование. Если ошибка произошла в библиотеке, библиотека должна её выбросить. Это позволит приложению, использующему библиотеку, самостоятельно принять решение о том, как обрабатывать эту ошибку.
Исключения, отклонения промисов, выдача событий error
Экземпляры класса Error содержат метаданные, которые полезны в деле определения причины ошибки. Например — данные трассировки стека и строки с сообщениями об ошибке. Распространённой является практика построения на основе класса Error классов ошибок, рассчитанных на конкретное приложение. При этом одно лишь создание экземпляра класса Error не приводит к каким-то заметным последствиям. Экземпляр ошибки нужно не только создать, но и выбросить.
А вот пример того, что при выполнении подобного кода выводится в консоли:
Отклонённые промисы, в отличие от неперехваченных исключений, не приводят, в Node.js v14, к остановке процесса. В будущих версиях Node.js отклонённые промисы будут завершать работу процессов. Подобные события, как и в случае с событиями ошибок, можно перехватывать с помощью объекта process :
Сигналы
В разных операционных системах могут быть определены различные сигналы. Ниже приведён список сигналов, которые, по большей части, универсальны.
Имя | Код | Подлежит ли сигнал обработке | Стандартная реакция Node.js | Цель сигнала |
1 | Да | Завершение работы | Закрытие терминала | |
2 | Да | Завершение работы | Сигнал прерывания (Ctrl+C) с терминала | |
3 | Да | Завершение работы | Сигнал Quit с терминала (Ctrl+D) | |
9 | Нет | Завершение работы | Безусловное завершение процесса | |
10 | Да | Запуск отладчика | Пользовательский сигнал №1 | |
12 | Да | Завершение работы | Пользовательский сигнал №2 | |
15 | Да | Завершение работы | Запрос на завершение работы процесса | |
19 | Нет | Завершение работы | Остановка выполнения процесса |
Если в программе может быть реализован механизм обработки соответствующего сигнала — в столбце таблицы «Подлежит ли сигнал обработке» стоит «Да». Два сигнала из таблицы с «Нет» в этой колонке обработке не подлежат. В столбце «Стандартная реакция Node.js» описана стандартная реакция Node.js-программы на получение соответствующего сигнала. В столбце «Цель сигнала» приведено описание стандартного общепринятого подхода к использованию сигналов.
Для обработки этих сигналов в Node.js-приложении можно воспользоваться уже знакомым нам механизмом объекта process по прослушиванию событий:
Возможно, вы уже догадались о том, что Node.js-программы могут отправлять сообщения другим программам. Выполните следующую команду, которая демонстрирует отправку сообщения от короткоживущего процесса работающему процессу:
В ответ на эту команду наш процесс покажет то же SIGHUP-сообщение, что показывал ранее. А если же работу этого процесса нужно завершить, ему надо отправить необрабатываемый сигнал SIGKILL :
После этого работа программы должна завершиться.
как остановить сервер node.js
Я запускаю сервер узлов, набрав
из замазочного терминала, чтобы запустить его. Теперь я хочу остановить сервер, как мне это сделать? Я попытался нажать кнопку паузы на клавиатуре. Но это не останавливает это.
Попробуй из другого терминала
Работает в OS X и Linux
Для справки, вот различные сигналы, которые вы можете отправить, чтобы остановить процесс, и что они означают: (со страницы man kill)
На окнах ОС в командной строке нажмите CTRL + C и дождитесь остановки, если это не произойдет, затем нажмите CTRL + C 2 раза, это точно сработает.
Ctrl + Shift + C делает трюк в терминале Ubuntu
У меня была та же проблема при запуске npm из Babun, а затем я попытался использовать Windows CMD (потому что у меня была похожая проблема при запуске команд git из Babun), и это показало разные результаты.
Когда я запускаю npm из CMD, мне нужно было нажать Enter, чтобы скрипт был выполнен, а затем меня попросили нажать w, чтобы показать больше деталей.
Я нажал w и это показало:
Отслеживание использования
›Нажмите f, чтобы запустить только неудачные тесты.
›Нажмите o, чтобы запустить только тесты, связанные с измененными файлами.
›Нажмите p, чтобы отфильтровать по шаблону регулярного выражения имени файла.
›Нажмите t для фильтрации по шаблону регулярного выражения имени теста.
›Нажмите q, чтобы выйти из режима просмотра.
›Нажмите Enter, чтобы запустить тестовый прогон.
Я нажал w и npm был остановлен и вернул управление в CMD.
Остановите программу node.js из командной строки
У меня есть простой TCP-сервер, который прослушивает порт.
Я закрываю программу неправильно? Как я могу предотвратить это?
11 ответов
Ctrl + Z приостанавливает его, что означает, что он все еще может работать.
Ctrl + C фактически убьет его.
Найдите идентификатор процесса (второй слева):
Это также может работать
Или, альтернативно, вы можете сделать все это в одной строке:
Вы можете заменить node внутри ‘\ snode\s’ на любое другое имя процесса.
Если вы выполняете Node.js в интерактивном режиме (REPL):
Ctrl + C вернет вас в > приглашение, затем введите:
$ sudo killall node в другом терминале работает с mac, а killall node не работает:
Скорее всего, вы сейчас в командной строке.
Дайте команде fg возобновить процесс на переднем плане.
или, если у вас нет pkill, это может сработать:
иногда процесс перечисляет свой собственный grep, и в этом случае вам понадобится:
h/t @ruffin из комментариев по самому вопросу. У меня была такая же проблема, и его комментарий помог мне решить ее сам.
Я добавляю этот ответ, потому что для многих проектов с производственными развертываниями у нас есть скрипты, которые останавливают эти процессы, поэтому нам не нужно.
Чистым способом управления процессами сервера Node является использование пакета forever (от NPM ).
Пример:
Установить Forever
Запустить Node Сервер
Результат:
info: Forever processing file: server.js
Выключение Node Сервер
forever stop server.js
Результат
info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj «/usr/bin/nodejs/node»
/path/to/your/project/server.js 23084 13176
Это приведет к чистому отключению вашего приложения Server.
Хотя это поздний ответ, я нашел это из Документы NodeJS:
Итак, чтобы подвести итог, вы можете выйти:
Если вы хотите остановить свой сервер с помощью npm stop или что-то вроде этого. Вы можете написать код, который убивает ваш серверный процесс следующим образом:
Примечание. Этот пример находится в оболочке bash на Mac.
Чтобы сделать это, я обязательно сделаю мой вызов node максимально конкретным. Например, вместо вызова node server.js из каталога приложений я вызываю node app_name_1/app/server.js
Это приведет только к уничтожению процесса node с запуском app_name_1/app/server.js.
Руководство по Node.js, часть 6: цикл событий, стек вызовов, таймеры
Цикл событий
Если вы хотите разобраться с тем, как выполняется JavaScript-код, то цикл событий (Event Loop) — это одна из важнейших концепций, которую необходимо понять. Здесь мы поговорим о том, как JavaScript работает в однопоточном режиме, и о том, как осуществляется обработка асинхронных функций.
Я многие годы занимался разработкой на JavaScript, но не могу сказать, что полностью понимал то, как всё функционирует, так сказать, «под капотом». Программист вполне может не знать о тонкостях устройства внутренних подсистем среды, в которой он работает. Но обычно полезно иметь хотя бы общее представление о подобных вещах.
JavaScript-код, который вы пишете, выполняется в однопоточном режиме. В некий момент времени выполняется лишь одно действие. Это ограничение, на самом деле, является весьма полезным. Это значительно упрощает то, как работают программы, избавляя программистов от необходимости решать проблемы, характерные для многопоточных сред.
Фактически, JS-программисту нужно обращать внимание только на то, какие именно действия выполняет его код, и стараться при этом избежать ситуаций, вызывающих блокировку главного потока. Например — выполнения сетевых вызовов в синхронном режиме и бесконечных циклов.
Обычно в браузерах, в каждой открытой вкладке, имеется собственный цикл событий. Это позволяет выполнять код каждой страницы в изолированной среде и избегать ситуаций, когда некая страница, в коде которой имеется бесконечный цикл или выполняются тяжёлые вычисления, способна «подвесить» весь браузер. Браузер поддерживает работу множества одновременно существующих циклов событий, используемых, например, для обработки вызовов к различным API. Кроме того, собственный цикл событий используется для обеспечения работы веб-воркеров.
Самое важное, что надо постоянно помнить JavaScript-программисту, заключается в том, что его код использует собственный цикл событий, поэтому код надо писать с учётом того, чтобы этот цикл событий не заблокировать.
Блокировка цикла событий
Любой JavaScript-код, на выполнение которого нужно слишком много времени, то есть такой код, который слишком долго не возвращает управление циклу событий, блокирует выполнение любого другого кода страницы. Подобное приводит даже к блокировке обработки событий пользовательского интерфейса, что выражается в том, что пользователь не может взаимодействовать с элементами страницы и нормально с ней работать, например — прокручивать.
Практически все базовые механизмы обеспечения ввода-вывода в JavaScript являются неблокирующими. Это относится и к браузеру и к Node.js. Среди таких механизмов, например, можно отметить средства для выполнения сетевых запросов, используемые и в клиентской и в серверной средах, и средства для работы с файлами Node.js. Существуют и синхронные способы выполнения подобных операций, но их применяют лишь в особых случаях. Именно поэтому в JavaScript огромное значение имеют традиционные коллбэки и более новые механизмы — промисы и конструкция async/await.
Стек вызовов
Стек вызовов (Call Stack) в JavaScript устроен по принципу LIFO (Last In, First Out — последним вошёл, первым вышел). Цикл событий постоянно проверяет стек вызовов на предмет того, имеется ли в нём функция, которую нужно выполнить. Если при выполнении кода в нём встречается вызов некоей функции, сведения о ней добавляются в стек вызовов и производится выполнение этой функции.
Если даже раньше вы не интересовались понятием «стек вызовов», то вы, если встречались с сообщениями об ошибках, включающими в себя трассировку стека, уже представляете себе, как он выглядит. Вот, например, как подобное выглядит в браузере.
Сообщение об ошибке в браузере
Браузер, при возникновении ошибки, сообщает о последовательности вызовов функций, сведения о которых хранятся в стеке вызовов, что позволяет обнаружить источник ошибки и понять, вызовы каких функций привели к сложившейся ситуации.
Теперь, когда мы в общих чертах поговорили о цикле событий и о стеке вызовов, рассмотрим пример, иллюстрирующий выполнение фрагмента кода, и то, как этот процесс выглядит с точки зрения цикла событий и стека вызовов.
Цикл событий и стек вызовов
Вот код, с которым мы будем экспериментировать:
Если этот код выполнить, в консоль попадёт следующее:
Изменение состояния стека вызовов при выполнении исследуемого кода
Цикл событий, на каждой итерации, проверяет, есть ли что-нибудь в стеке вызовов, и если это так — выполняет это до тех пор, пока стек вызовов не опустеет.
Итерации цикла событий
Постановка функции в очередь на выполнение
Вышеприведённый пример выглядит вполне обычным, в нём нет ничего особенного: JavaScript находит код, который надо выполнить, и выполняет его по порядку. Поговорим о том, как отложить выполнение функции до момента очистки стека вызовов. Для того чтобы это сделать, используется такая конструкция:
То, что выведет этот код, возможно, покажется неожиданным:
Вот как теперь будет выглядеть стек вызовов.
Изменение состояния стека вызовов при выполнении исследуемого кода
Вот в каком порядке теперь будут выполняться функции в нашей программе.
Итерации цикла событий
Почему всё происходит именно так?
Очередь событий
Цикл событий отдаёт приоритет тому, что находится в стеке вызовов. Сначала он выполняет всё, что ему удаётся найти в стеке, а после того, как стек оказывается пустым, переходит к обработке того, что находится в очереди событий.
Очередь заданий ES6
В ECMAScript 2015 (ES6) была введена концепция очереди заданий (Job Queue), которой пользуются промисы (они тоже появились в ES6). Благодаря очереди заданий результатом выполнения асинхронной функции можно воспользоваться настолько быстро, насколько это возможно, без необходимости ожидания очищения стека вызовов.
Если промис разрешается до окончания выполнения текущей функции, соответствующий код будет выполнен сразу после того, как текущая функция завершит работу.
Я обнаружил интересную аналогию для того, о чём мы сейчас говорим. Это можно сравнить с американскими горками в парке развлечений. После того, как вы прокатились на горке и хотите сделать это ещё раз, вы берёте билет и становитесь в хвост очереди. Так работает очередь событий. А вот очередь заданий выглядит иначе. Эта концепция похожа на льготный билет, который даёт вам право совершить следующую поездку сразу после того, как вы закончили предыдущую.
Рассмотрим следующий пример:
Вот что будет выведено после его выполнения:
То, что тут можно видеть, демонстрирует серьёзное различие промисов (и конструкции async/await, которая на них основана) и традиционных асинхронных функций, выполнение которых организуется посредством setTimeout() или других API используемой платформы.
process.nextTick()
Предположим, цикл событий занят выполнением кода текущей функции. Когда эта операция завершается, JavaScript-движок выполнит все функции, переданные process.nextTick() в ходе выполнения предыдущей операции. Используя этот механизм, мы стремимся к тому, чтобы некая функция была бы выполнена асинхронно (после текущей функции), но как можно скорее, без постановки её в очередь.
setImmediate()
Таймеры
▍Функция setTimeout()
Напомним, что при вызове функции setTimeout() ей передают коллбэк и время, в миллисекундах, по прошествии которого будет вызван коллбэк. Рассмотрим пример:
Здесь мы передаём setTimeout() новую функцию, тут же описываемую, но здесь можно использовать и существующую функцию, передавая setTimeout() её имя и набор параметров для её запуска. Выглядит это так:
Функция setTimeout() возвращает идентификатор таймера. Обычно он не используется, но его можно сохранить, и, при необходимости, удалить таймер, если в запланированном выполнении коллбэка больше нет необходимости:
▍Нулевая задержка
Такой код выведет следующее:
▍Функция setInterval()
Коллбэк, переданный функции, показанной выше, будет вызываться каждые 2 секунды. Для того чтобы предусмотреть возможность остановки этого процесса, нужно получить идентификатор таймера, возвращаемый setInterval() и воспользоваться командой clearInterval() :
Распространённой методикой является вызов clearInterval() внутри коллбэка, переданного setInterval() при выполнении некоего условия. Например, следующий код будет периодически запускаться до тех пор, пока свойство App.somethingIWait не примет значение arrived :
▍Рекурсивная установка setTimeout()
Функция setInterval() будет вызывать переданный ей коллбэк каждые n миллисекунд, не заботясь о том, завершилось ли выполнение этого коллбэка после его предыдущего вызова.
Периодически вызываемый коллбэк, каждый сеанс выполнения которого занимает одно и то же время, укладывающееся в промежуток между вызовами
Периодически вызываемый коллбэк, каждый сеанс выполнения которого занимает разное время, укладывающееся в промежуток между вызовами
Периодически вызываемый коллбэк, каждый сеанс выполнения которого занимает разное время, которое иногда не укладывается в промежуток между вызовами
При таком подходе можно реализовать следующий сценарий:
Рекурсивный вызов setTimeout() для планирования выполнения коллбэка
Как завершить скрипт в JavaScript?
17 ответов
JavaScript-эквивалент для die PHP. Кстати, он просто вызывает exit() (спасибо splattne ) :
Это просто останавливает выполнение программы из этой строки, вместо того, чтобы выдавать какие-либо ошибки в консоли.
Я использую этот кусок кода, чтобы остановить выполнение:
Вы получите ошибку консоли, но она хорошо работает для меня.
Эта небольшая функция довольно близка к имитации выхода PHP (). Как и с другими решениями, больше ничего не добавляйте.
Даже в простых программах без дескрипторов, событий и тому подобного лучше всего поместить код в «основную» функцию, даже если это единственная процедура:
Таким образом, когда вы хотите остановить программу, вы можете использовать «возврат».
Поместите ключевое слово debugger; в код JavaScript, где вы хотите остановить выполнение. Затем откройте инструменты разработчика вашего любимого браузера и перезагрузите страницу. Теперь он должен остановиться автоматически. Откройте раздел Источники своих инструментов: ключевое слово debugger; выделено, и у вас есть возможность возобновить выполнение скрипта.
Я надеюсь, что это помогает.
Дополнительная информация по адресу:
Я думаю, что на этот вопрос был дан ответ, нажмите здесь для получения дополнительной информации. Ниже приведен краткий ответ.
Вы также можете использовать свой браузер для добавления точек останова, каждый браузер похож, проверьте информацию ниже для вашего браузера.
Чтобы получить информацию о точках останова Chrome, нажмите здесь
Чтобы получить информацию о точках останова Firefox, нажмите здесь
Для получения информации о точках останова Explorer нажмите
Чтобы получить информацию о точках останова Safari, нажмите здесь.
Обратите внимание, что на практике интерпретаторы Javascript большинства браузеров просто останавливают текущий скрипт, если они сталкиваются с ошибкой. Таким образом, вы можете сделать что-то вроде доступа к атрибуту неустановленной переменной:
И это вероятно прервет сценарий. Но вы не должны рассчитывать на это, потому что это совсем не стандартно, и это действительно кажется ужасной практикой.
Функции выхода обычно выходят из программы или скрипта вместе с сообщением об ошибке в качестве параметра. Например умереть (. ) в PHP
Вы можете легко проверить это:
Если вам все равно, что это ошибка, просто напишите:
Это остановит ваш основной (глобальный) код. Полезно для некоторых аспектов отладки / тестирования.
Это пример того, что, если условие существует, то завершить сценарий. Я использую это в моем клиентском JavaScript SSE, если
. в любом случае, общая идея такова:
Это прекратит / покрасит ваш скрипт javascript
Бросить «»;
Это неправильное использование концепции, но, вероятно, единственный вариант. И, да, вам придется сбросить все прослушиватели событий, как упоминается в принятом ответе. Вам также понадобится одна точка входа, если я прав.
Window.stop ( ) ;
Это не работает во время загрузки страницы. Останавливает также декодирование страницы. Таким образом, вы не можете использовать его, чтобы предложить пользователю вариант вашей страницы без использования JavaScript.
Отладчик ;
Останавливает выполнение только при открытом отладчике. Прекрасно работает, но не доставляется.
Если вы используете любую неопределенную функцию в скрипте, тогда скрипт остановится из-за «Uncaught ReferenceError». Я попытался с помощью следующего кода и первые две строки выполнены.
Я думаю, это лучший способ остановить сценарий. Если есть другой способ, пожалуйста, прокомментируйте меня. Я также хочу знать другой лучший и простой способ. Кстати, я не получил выход или умереть встроенную функцию в Javascript, как PHP для завершения сценария. Если кто-то знает, пожалуйста, дайте мне знать.
Существует много способов выйти из сценария JS или Node. Вот наиболее актуальные:
В моем случае я использовал window.stop API, который похож на нажатие кнопки X в вашем браузере:
Просто создайте условие BOOL, здесь нет необходимости в сложном коде.