Как остановить приложение, в котором node.js выражает 'npm start'


103

Вы создаете приложение node.js с помощью express v4.x, а затем запускаете приложение с помощью npm start . У меня вопрос, как остановить приложение? Есть ли остановка npm ?

ИЗМЕНИТЬ, чтобы включить ошибку при реализации npm stop

/home/nodetest2# npm stop

> nodetest2@0.0.1 stop /home/nodetest2
> pkill -s SIGINT nodetest2

pkill: invalid argument for option 's' -- SIGINT

npm ERR! nodetest2@0.0.1 stop: `pkill -s SIGINT nodetest2`
npm ERR! Exit status 2

Ответы:


66

Да, в npm также есть сценарий остановки:

npm help npm-scripts

prestop, stop, poststop: запускается командой npm stop.

Установите одно из вышеперечисленных в свой package.json, а затем используйте npm stop

npm help npm-stop

Вы можете сделать это действительно просто, если настроитесь app.js,

process.title = myApp;

Затем в scripts.json

"scripts": {
    "start": "app.js"
    , "stop": "pkill --signal SIGINT myApp"
}

Тем не менее, если бы это был я, я бы использовал pm2или что-то, что автоматически обрабатывало бы это на основе git push.


Все еще есть ошибка. Очевидно, я хорошо разбираюсь в строковых командах.
ngungo

@ngungo скорее --signal. Используйте, man pkillчтобы прочитать о pkill.
Эван Кэрролл

3
@EvanCarroll Что делать, если запущено несколько экземпляров приложения?
Амит Кумар Гупта

1
Любая идея, как реализовать это в приложении angular 4. В частности, где я могу настроить заголовок процесса?
kiranghule27

41

Все остальные решения здесь зависят от ОС. Самостоятельное решение для любой ОС использует socket.io следующим образом.

package.json имеет два скрипта:

"scripts": {
  "start": "node server.js",
  "stop": "node server.stop.js"
}

server.js - здесь живут ваши обычные экспресс-материалы

const express = require('express');
const app = express();
const server = http.createServer(app);
server.listen(80, () => {
  console.log('HTTP server listening on port 80');
});

// Now for the socket.io stuff - NOTE THIS IS A RESTFUL HTTP SERVER
// We are only using socket.io here to respond to the npmStop signal
// To support IPC (Inter Process Communication) AKA RPC (Remote P.C.)

const io = require('socket.io')(server);
io.on('connection', (socketServer) => {
  socketServer.on('npmStop', () => {
    process.exit(0);
  });
});

server.stop.js

const io = require('socket.io-client');
const socketClient = io.connect('http://localhost'); // Specify port if your express server is not using default port 80

socketClient.on('connect', () => {
  socketClient.emit('npmStop');
  setTimeout(() => {
    process.exit(0);
  }, 1000);
});

Проверить это

npm start (чтобы запустить свой сервер как обычно)

npm stop (это остановит ваш работающий сервер)

Приведенный выше код не был протестирован (это урезанная версия моего кода, мой код действительно работает), но, надеюсь, он работает как есть. В любом случае, он дает общее направление, если вы хотите использовать socket.io для остановки вашего сервера.


3
Прелесть этого подхода в том, что вы можете запустить его в любом окружении, включая контейнеры, которые обычно весьма ограничивают способы управления процессами. С моей личной точки зрения - это самый элегантный подход.
Der Zinger

Это красиво
mondlos

16

Когда я попробовал предложенное решение, я понял, что имя моего приложения было усечено. Я прочитал process.titleв документации nodejs ( https://nodejs.org/docs/latest/api/process.html#process_process_title ), и там говорится

В Linux и OS X он ограничен размером двоичного имени плюс длиной аргументов командной строки, поскольку он перезаписывает память argv.

Мое приложение не использует аргументов, поэтому я могу добавить эту строку кода в свой app.js

process.title = process.argv[2];

а затем добавьте эти несколько строк в мой package.jsonфайл

  "scripts": {
    "start": "node app.js this-name-can-be-as-long-as-it-needs-to-be",
    "stop": "killall -SIGINT this-name-can-be-as-long-as-it-needs-to-be"
  },

использовать действительно длинные имена процессов. npm startи npm stopработа, конечно npm stop, всегда завершает все запущенные процессы, но для меня это нормально.


12

Это проблема версии mintty или используйте cmd. Чтобы убить процесс сервера, просто выполните эту команду:

    taskkill -F -IM node.exe

2
не лучшая идея убивать основной node.exe, так как это создаст проблему в случае, если у вас запущено несколько приложений node
user889030

11

В MAC OS X (/ BSD): вы можете попробовать использовать команду lsof (список открытых файлов)

$ sudo lsof -nPi -sTCP:LISTEN

введите описание изображения здесь

так что

$ kill -9 3320

9

Проверьте с помощью netstat -nptl все процессы

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      1736/mongod     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1594/sshd       
tcp6       0      0 :::3977                 :::*                    LISTEN      6231/nodejs     
tcp6       0      0 :::22                   :::*                    LISTEN      1594/sshd       
tcp6       0      0 :::3200                 :::*                    LISTEN      5535/nodejs 

И он просто убивает процесс по ссылке PID .... В моем случае я хочу остановить 6231 / nodejs, поэтому я выполняю следующую команду:

kill -9 6231

1
Я думаю, что OP ищет вариант сценария NPM, а не консоль.
Фараджи Андерсон

4

Вот еще одно решение, в котором смешаны идеи из предыдущих ответов. Он использует подход «процесса уничтожения», решая проблему независимости платформы.

Он полагается на пакет tree-kill для обработки уничтожения дерева процессов сервера. Я обнаружил, что в моих проектах необходимо уничтожить все дерево процессов, потому что некоторые инструменты (например babel-node) порождают дочерние процессы. Если вам нужно убить только один процесс, вы можете заменить tree-kill на встроенный process.kill()метод.

Далее следует решение (первые два аргумента spawn()должны быть изменены, чтобы отразить конкретный рецепт запуска вашего сервера):

сборка / start-server.js

import { spawn } from 'child_process'
import fs from 'fs'

const child = spawn('node', [
  'dist/server.js'
], {
  detached: true,
  stdio: 'ignore'
})
child.unref()

if (typeof child.pid !== 'undefined') {
  fs.writeFileSync('.server.pid', child.pid, {
    encoding: 'utf8'
  })
}

сборка / стоп-server.js

import fs from 'fs'
import kill from 'tree-kill'

const serverPid = fs.readFileSync('.server.pid', {
  encoding: 'utf8'
})
fs.unlinkSync('.server.pid')

kill(serverPid)

package.json

"scripts": {
  "start": "babel-node build/start-server.js",
  "stop": "babel-node build/stop-server.js"
}

Обратите внимание, что это решение отсоединяет сценарий запуска от сервера (т.е. npm startвозвращается немедленно и не блокируется, пока сервер не будет остановлен). Если вы предпочитаете традиционное поведение блокировки, просто удалите options.detachedаргумент spawn()и вызов child.unref().


3

Если вы уже пробовали, ctrl + cно по-прежнему не работает, вы можете попробовать это. Это сработало для меня.

  1. Запустите командную строку от имени администратора. Затем выполните команду ниже, чтобы найти идентификатор процесса (PID), который вы хотите убить. Введите номер вашего порта в<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

введите описание изображения здесь

  1. Затем вы выполняете эту команду после того, как определили PID.

    taskkill /PID <typeYourPIDhere> /F

введите описание изображения здесь

Престижность @mit $ ingh с http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157


2

Если очень просто, просто убейте процесс ..

localmacpro$ ps
  PID TTY           TIME CMD
 5014 ttys000    0:00.05 -bash
 6906 ttys000    0:00.29 npm   
 6907 ttys000    0:06.39 node /Users/roger_macpro/my-project/node_modules/.bin/webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
 6706 ttys001    0:00.05 -bash
 7157 ttys002    0:00.29 -bash

localmacpro$ kill -9 6907 6906

2

Для машины с Windows (я использую Windows 10), если команда CTRL + C (Отмена / Прервать) на cli не работает, и экран выглядит следующим образом:

введите описание изображения здесь

Попробуйте сначала нажать ENTER (или подойдет любая клавиша), а затем CTRL + C, и текущий процесс спросит, хотите ли вы прервать пакетное задание:

введите описание изображения здесь

Возможно, CTRL + C завершает только родительский процесс, в то время как npm start выполняется с другими дочерними процессами. Совершенно не уверен, почему вам нужно нажимать эту дополнительную клавишу, хотя до CTRL + C, но это работает лучше, чем закрывать командную строку и начинать заново.

Связанная проблема, которую вы можете проверить: https://github.com/mysticatea/npm-run-all/issues/74




0

Если в вашем json-файле нет сценария для остановки приложения, я использую вариант, который просто нажимаю ctrl + C в cmd.


-1

Все (3) солоция:

1- ctlr + C

2- в json файле напишите скрипт, который останавливает

"scripts": {"stop": "killall -SIGINT this-name-can-be-as-long-as-it-need-to-be"},

* чем в команде write // npm stop //

3- Перезагрузите компьютер


7
Перезагрузите компьютер , правда?!? Почему бы просто не перевернуть главный автоматический выключатель? : D
stk

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.