Как остановить приложение, которое 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
Ответы
Ответ 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
но он все еще не работает, вы можете попробовать это. Это сработало для меня.
- Запустите командную строку от имени администратора. Затем выполните приведенную ниже команду упоминания. введите номер вашего порта в yourPortNumber
netstat -ano | findstr:
![enter image description here]()
- Затем вы выполняете эту команду после определения 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