Как остановить приложение этого узла.Яш экспресс 'НПМ начать
вы строите узел.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 ответов:
да, 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