Подтвердить что ты не робот

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

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

EDIT включить ошибку при реализации npm stop

/home/nodetest2# npm stop

> [email protected] stop /home/nodetest2
> pkill -s SIGINT nodetest2

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

npm ERR! [email protected] stop: `pkill -s SIGINT nodetest2`
npm ERR! Exit status 2
4b9b3361

Ответ 1

Да, npm также предусматривает остановку script:

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.

Ответ 2

Все остальные решения здесь зависят от ОС. Независимое решение для любой ОС использует 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

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

Ответ 4

Проверьте 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

Ответ 5

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

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

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

сборки/старт-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"
}

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

Ответ 6

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

    taskkill -F -IM node.exe

Ответ 7

Если это очень просто, просто запустите процесс.

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

Ответ 8

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

$ sudo lsof -nPi -sTCP:LISTEN

enter image description here

так что

$ kill -9 3320

Ответ 9

Все (3) посвящение это:

1- ctlr + C

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

"scripts": {"stop": "killall -SIGINT это имя может быть таким длинным, какое ему нужно"},

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

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

Ответ 10

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

  1. Запустите командную строку от имени администратора. Затем выполните приведенную ниже команду упоминания. введите номер вашего порта в yourPortNumber

netstat -ano | findstr:

enter image description here

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

Taskkill/PID/F

Слава @mit $ ingh от http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157

enter image description here

Ответ 11

Вы должны нажать комбинацию ctrl + z Мой os - Ubuntu