नोड को रोकने के लिए एप्लिकेशन को कैसे रोकें। 'npm start'


100

आप एक्सप्रेस v4.x के साथ नोड.जेएस ऐप का निर्माण करते हैं फिर अपने ऐप को एनपीएम स्टार्ट से शुरू करते हैं । मेरा सवाल है कि ऐप कैसे बंद करें? क्या npm बंद है ?

Npm स्टॉप लागू करते समय त्रुटि को शामिल करने के लिए EDIT

/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 स्टॉप कमांड द्वारा चलाएँ।

अपने पैकेज में उपरोक्त में से एक सेट करें। Json, और फिर उपयोग करें npm stop

npm help npm-stop

यदि आप सेट करते हैं app.js, तो आप इसे वास्तव में सरल बना सकते हैं

process.title = myApp;

और, फिर script.json में,

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

उस ने कहा, अगर यह मैं था, मैं उपयोग pm2कर रहा हूँ या कुछ स्वचालित रूप से एक धक्का धक्का के आधार पर यह नियंत्रित किया जाएगा।


फिर भी त्रुटि हुई। जाहिर है मैं लाइन कमांड में अच्छी तरह से वाकिफ हूं।
ngungo

बल्कि @ngungo --signalman pkillPkill के बारे में पढ़ने के लिए उपयोग करें ।
इवान कैरोल

3
@EvanCarroll क्या होगा यदि ऐप के कई उदाहरण चल रहे हैं?
अमित कुमार गुप्ता

1
किसी भी विचार को कोणीय 4 ऐप में इसे कैसे लागू किया जाए। विशेष रूप से मैं प्रक्रिया शीर्षक कहां स्थापित करूं?
kiranghule27

40

यहां अन्य सभी समाधान ओएस पर निर्भर हैं। किसी भी OS के लिए एक स्वतंत्र समाधान सॉकेट का उपयोग करता है। इस प्रकार है।

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 (यह अब आपके रनिंग सर्वर को बंद कर देगा)

उपरोक्त कोड का परीक्षण नहीं किया गया है (यह मेरे कोड का कट डाउन संस्करण है, मेरा कोड काम करता है) लेकिन उम्मीद है कि यह जैसा है वैसा ही काम करता है। किसी भी तरह से, यह सामान्य दिशा प्रदान करता है यदि आप अपने सर्वर को बंद करने के लिए सॉकेट का उपयोग करना चाहते हैं।


2
इस दृष्टिकोण की सुंदरता यह है कि आप मूल रूप से किसी भी env पर चल सकते हैं, जिसमें कंटेनर भी शामिल हैं, जो आमतौर पर प्रक्रियाओं में हेरफेर करने के लिए काफी प्रतिबंध हैं। मेरे बहुत ही व्यक्तिगत दृष्टिकोण से - यह सबसे सुरुचिपूर्ण दृष्टिकोण है।
डेर जिंजर

16

जब मैंने सुझाए गए समाधान की कोशिश की तो मुझे महसूस हुआ कि मेरे ऐप का नाम छोटा था। मैं process.titleनोडज डॉक्यूमेंटेशन ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) पर पढ़ता हूं और यह कहता है

लिनक्स और 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
मुख्य नोड को मारने के लिए अच्छा विचार नहीं है। क्योंकि यह समस्या पैदा करेगा यू में कई नोड ऐप चल रहे हैं
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 

और यह बस पीआईडी ​​संदर्भ द्वारा प्रक्रिया को मारता है .... मेरे मामले में मैं 6231 / नोडज को रोकना चाहता हूं इसलिए मैं निम्नलिखित कमांड निष्पादित करता हूं:

kill -9 6231

1
मुझे लगता है कि ओपी एक एनपीएम लिपि विकल्प के लिए देख रहा है जो कंसोल नहीं है।
फराजी एंडरसन

4

यहां एक और समाधान है जो पिछले उत्तरों से विचारों को मिलाता है। मंच की स्वतंत्रता के बारे में चिंता को संबोधित करते हुए यह "मार प्रक्रिया" दृष्टिकोण लेता है।

यह सर्वर प्रोसेस ट्री को मारने के लिए ट्री-किल पैकेज पर निर्भर करता है । मैंने अपनी परियोजनाओं में आवश्यक पूरी प्रक्रिया के पेड़ को मारना पाया क्योंकि कुछ उपकरण (जैसे babel-node) बच्चे की प्रक्रियाओं को स्पॉन करते हैं। यदि आपको केवल एक प्रक्रिया को मारने की आवश्यकता है, तो आप बिल्ट-इन 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"
}

ध्यान दें कि यह समाधान सर्वर से प्रारंभ स्क्रिप्ट को अलग करता है (अर्थात npm startतुरंत वापस आ जाएगा और सर्वर बंद होने तक ब्लॉक नहीं करेगा)। यदि आप पारंपरिक ब्लॉकिंग व्यवहार को पसंद करते हैं, तो बस options.detachedतर्क को spawn()और कॉल को हटा दें child.unref()


3

यदि आप पहले ही प्रयास कर चुके हैं ctrl + cऔर यह अभी भी काम नहीं कर रहा है, तो आप यह कोशिश करना चाह सकते हैं। इसने मेरे लिए काम किया है।

  1. एक प्रशासक के रूप में कमांड-लाइन चलाएं। फिर जिस कमांड (PID) को आप मारना चाहते हैं उसे खोजने के लिए नीचे कमांड को चलाएं। में अपना पोर्ट नंबर टाइप करें<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

यहां छवि विवरण दर्ज करें

  1. PID की पहचान करने के बाद आप इस आदेश को निष्पादित करते हैं।

    taskkill /PID <typeYourPIDhere> /F

यहां छवि विवरण दर्ज करें

Kudos से @ $ $ 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

विंडोज़ मशीन के लिए (मैं विंडोज़ 10 पर हूँ), यदि cli पर CTRL + C (रद्द / निरस्त) कमांड काम नहीं करता है, और स्क्रीन इस तरह से दिखाई देती है:

यहां छवि विवरण दर्ज करें

ENTER को पहले हिट करने का प्रयास करें (या कोई भी कुंजी करेगा) और फिर CTRL + C और वर्तमान प्रक्रिया पूछेंगी कि क्या आप बैच की नौकरी समाप्त करना चाहते हैं:

यहां छवि विवरण दर्ज करें

शायद CTRL + C केवल मूल प्रक्रिया को समाप्त करता है जबकि npm अन्य बाल प्रक्रियाओं के साथ चलता है। काफी अनिश्चित है कि आपको CTRL + C से पहले उस अतिरिक्त कुंजी को क्यों मारना है, लेकिन यह कमांड लाइन को बंद करने और फिर से शुरू करने से बेहतर काम करता है।

एक संबंधित समस्या जिसे आप जांचना चाहते हैं: https://github.com/mysticatea/npm-run-all/issues/74


0

उत्पादन वातावरण के लिए आपको Forever.js का उपयोग करना चाहिए

यह नोड प्रक्रिया को शुरू करने और रोकने के लिए इतना उपयोग है, आप ऐप को भी चला सकते हैं।

https://github.com/foreverjs/forever


0

आप pm2 का उपयोग कर सकते हैं

https://pm2.keymetrics.io/docs/usage/quick-start/

स्थापना के बाद टर्मिनल में बस टाइप करें

pm2 start app.js और फिर

pm2 stop 0 अपने सर्वर को बंद करने के लिए


0

यदि आपकी जसन फ़ाइल में ऐप को बंद करने के लिए कोई स्क्रिप्ट नहीं है, तो एक विकल्प जो मैं उपयोग करता हूं वह केवल cmd पर ctrl + C दबाकर है।


-1

सभी (3) एकांत है:

1- सीटीएलआर + सी

2- json फाइल में एक स्क्रिप्ट होती है जो बंद हो जाती है

"स्क्रिप्ट्स": {"स्टॉप": "किलॉल -इस-नेम-नेम-ए-लॉन्ग-एज़-लॉन्ग-एज़-नीड्स-टू-बीइंग"} -SIGINT

* कमांड लिखने की तुलना में // npm स्टॉप //

3- पीसी को रीस्टार्ट करें


7
पीसी पुनरारंभ करें , वास्तव में?!? सिर्फ मुख्य सर्किट ब्रेकर को क्यों नहीं फ्लिप करें? : D
stk

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.