Как остановить приложение этого узла.Яш экспресс 'НПМ начать


вы строите узел.js приложение с экспресс v4.x затем запустите приложение с помощью npm start. Мой вопрос заключается в том, как остановить приложение? Есть ли npm stop?

редактировать чтобы включить ошибку при реализации 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
7 67

7 ответов:

да, npm также предоставляет сценарий остановки:

npm help npm-scripts

prestop, stop, poststop: выполняется командой npm stop.

установите один из вышеуказанных в вашем пакете.JSON, а затем использовать npm stop

npm help npm-stop

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

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

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

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

сервер.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);
  });
});

сервер.остановка.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 чтобы остановить ваш сервер.

когда я попробовал предложенное решение, я понял, что мое имя приложения было усечено. Я читал на 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 file

  "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 всегда будет завершить все запущенные процессы, но это нормально для меня.

чека с 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

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

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

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

build / 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'
  })
}

build / stop-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)

пакета.json

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

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

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

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

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

    taskkill -F -IM node.exe