Як зупинити додаток, який node.js виражає "npm start"


100

Ви будуєте додаток node.js з express v4.x, а потім запускаєте додаток до npm start . Моє запитання - як зупинити додаток? Чи є зупинка npm ?

EDIT для включення помилки під час зупинки npm

/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.

Встановіть одне із перерахованого вище у пакеті.json та використовуйте npm stop

npm help npm-stop

Ви можете зробити це по-справжньому просто, якщо ввійти app.js,

process.title = myApp;

А потім у script.json,

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

Це сказало, що якщо б це я, я б використовував pm2або щось, що автоматично обробляв це на основі git push.


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

@ngungo, скоріше --signal. Використовуйте man pkillдля читання про pkill.
Еван Керролл

3
@EvanCarroll Що робити, якщо працює кілька примірників програми?
Аміт Кумар Гупта

1
Будь-яка ідея, як реалізувати це в 4-му додатку. Зокрема, де я можу встановити назву процесу?
kiranghule27

40

Всі інші рішення тут залежать від ОС. Незалежне рішення для будь-якої ОС використовує 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 для зупинки вашого сервера.


2
Краса такого підходу полягає в тому, що в основному ти можеш працювати з будь-якою програмою env, включаючи контейнери, які, як правило, досить обмежують те, як ти маніпулюєш процесами. З моєї особистої точки зору - це найелегантніший підхід.
Der Zinger

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

Це проблема м'ятної версії, альтернативно використовуйте cmd. Щоб вбити серверний процес, просто запустіть цю команду:

    taskkill -F -IM node.exe

2
не гарна ідея вбити основний node.exe, оскільки це створить проблему, якщо у вас працює кілька додатків для вузла
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
Я думаю, що ОП шукає параметр сценарію NPM, а не консоль.
Фараджі Андерсон

4

Ось ще одне рішення, яке змішує ідеї з попередніх відповідей. Він застосовує підхід "процесу вбивства", вирішуючи при цьому питання про незалежність платформи.

Він покладається на пакунок дерева-kill для обробки вбивства дерева серверного процесу. Я вважав, що вбивство всього дерева технологічних процесів необхідне в моїх проектах, оскільки деякі інструменти (наприклад babel-node) нерестові дочірні процеси Якщо вам потрібно вбити лише один процес, ви можете замінити дерево-убиття вбудованим 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)

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. Запустити командний рядок як адміністратор. Потім запустіть команду нижче, щоб знайти процесID (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

1

Для машини Windows (я на Windows 10), якщо CTRL + C (Скасувати / Скасувати) Команда на кліпі не працює, і екран відображається так:

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

Спробуйте спочатку натиснути клавішу ENTER (або зробить будь-яка клавіша), а потім CTRL + C і поточний процес запитає, чи хочете ви припинити пакетне завдання:

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

Можливо, CTRL + C лише припиняє батьківський процес, поки npm start запускається з іншими дочірніми процесами. Зовсім невідомо, чому вам потрібно натиснути цей додатковий ключ, хоча до CTRL + C, але він працює краще, ніж потрібно закривати командний рядок і починати заново.

Пов’язана проблема, яку ви можете перевірити: https://github.com/mysticatea/npm-run-all/isissue/74




0

Якщо у вашому json-файлі немає сценарію, щоб зупинити додаток, я використовую варіант, просто натискаючи ctrl + C на cmd.


-1

Усі (3) соціології:

1- ctlr + C

2- у файлі json наберіть сценарій, який зупиняється

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

* ніж у команді write // npm stop //

3- Перезавантажте ПК


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.