Node.js 'এনপিএম স্টার্ট' প্রকাশ করে এমন অ্যাপটি কীভাবে বন্ধ করবেন


104

আপনি এক্সপ্রেস v4.x দিয়ে নোড.জেএস অ্যাপ তৈরি করেন তারপরে এনপিএম স্টার্ট দিয়ে আপনার অ্যাপ্লিকেশনটি শুরু করুন । আমার প্রশ্ন হল অ্যাপটি কীভাবে বন্ধ করা যায়? আছে কি 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 help npm-scripts

প্রিস্টপ, স্টপ, পোস্টসটপ: এনপিএম স্টপ কমান্ড দ্বারা চালিত।

আপনার প্যাকেজ.জেসনে উপরের একটি সেট করুন এবং তারপরে ব্যবহার করুন npm stop

npm help npm-stop

আপনি যদি সেট আপ করেন তবে আপনি এটি সত্যই সহজ করতে পারেন app.js,

প্রক্রিয়া.টাইটেল = আমার অ্যাপ;

এবং, স্ক্রিপ্টস.জেসনে,

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

এটি বলেছিল, এটি যদি আমি হয় তবে আমি pm2গিট পুশের ভিত্তিতে স্বয়ংক্রিয়ভাবে হ্যান্ডেল করে এমন কিছু ব্যবহার করতাম something


তবু ত্রুটি পেয়েছে। স্পষ্টতই আমি লাইন কমান্ডে পারদর্শী।
এনজিঙ্গো

বরং --signal! man pkillপিলার সম্পর্কে পড়তে ব্যবহার করুন ।
ইভান ক্যারল

4
@ ইভানক্রোল যদি একাধিক অ্যাপ্লিকেশন চালু থাকে তবে কী হবে?
অমিত কুমার গুপ্ত 10

4
কৌনিক 4 অ্যাপে এটি কীভাবে বাস্তবায়ন করা যায় তার কোনও ধারণা। বিশেষত যেখানে আমি প্রক্রিয়া শিরোনাম সেট আপ করব?
কিরানঘুলে

41

এখানে অন্যান্য সমস্ত সমাধান ওএস নির্ভর। যে কোনও ওএসের একটি স্বতন্ত্র সমাধান নীচে सॉকেট.ইও ব্যবহার করে।

package.json দুটি স্ক্রিপ্ট রয়েছে:

"scripts": {
  "start": "node server.js",
  "stop": "node server.stop.js"
}

server.js - আপনার স্বাভাবিক এক্সপ্রেস স্টাফ এখানে থাকে lives

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 (এটি এখন আপনার চলমান সার্ভারটি বন্ধ করে দেবে)

উপরের কোডটি পরীক্ষা করা হয়নি (এটি আমার কোডের একটি কাটা ডাউন সংস্করণ, আমার কোডটি কাজ করে) তবে আশা করি এটি যেমন রয়েছে তেমন কাজ করে। যে কোনও উপায়ে, আপনি যদি আপনার সার্ভারটি বন্ধ করতে सॉকেট.ইও ব্যবহার করতে চান তবে এটি নিতে সাধারণ দিকনির্দেশ সরবরাহ করে।


4
এই পদ্ধতির সৌন্দর্যটি হ'ল মূলত আপনি যে কোনও এনভির সাথে চলতে পারেন, পাত্রে অন্তর্ভুক্ত যা সাধারণত আপনি কীভাবে প্রক্রিয়াগুলি পরিচালনা করেন তার পক্ষে বেশ সীমাবদ্ধ are আমার খুব ব্যক্তিগত দৃষ্টিকোণ থেকে - এটি সবচেয়ে মার্জিত পদ্ধতির approach
ডের জিঞ্জার

এটি সুন্দর
সোমবার

16

আমি প্রস্তাবিত সমাধানটি চেষ্টা করার সময় বুঝতে পারলাম আমার অ্যাপের নামটি কেটে গেছে। আমি process.titleনোডেজ ডকুমেন্টেশনে পড়েছি ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) এবং এতে বলা হয়েছে

লিনাক্স এবং ওএস এক্স-তে এটি বাইনারি নামের আকার এবং কমান্ড লাইন আর্গুমেন্টের দৈর্ঘ্যের মধ্যে সীমাবদ্ধ কারণ এটি আরগভি মেমরির ওভাররাইট করে।

আমার অ্যাপ্লিকেশনটি কোনও যুক্তি ব্যবহার করে না, তাই আমি কোডটিতে এই লাইনটি যুক্ত করতে পারি 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

এটি একটি পুদিনা সংস্করণ সমস্যা যা বিকল্পভাবে সেমিডি ব্যবহার করুন। সার্ভার প্রক্রিয়াটি হত্যার জন্য এই কমান্ডটি চালান:

    taskkill -F -IM node.exe

4
মূল নোড.এক্সিকে হত্যা করা ভাল নয় কারণ এটি আপনার একাধিক নোড অ্যাপ্লিকেশন চলার ক্ষেত্রে সমস্যা তৈরি করবে
user889030

12

ম্যাক ওএস এক্স (/ বিএসডি) তে: আপনি lsof (তালিকা ফাইল খুলুন) কমান্ডটি ব্যবহার করার চেষ্টা করতে পারেন

$ sudo lsof -nPi -sTCP:LISTEN

এখানে চিত্র বর্ণনা লিখুন

এবং তাই

$ kill -9 3320

4
ধন্যবাদ, ডেবিয়ান 10.5
নক্সফ্লাই

9

নেটস্ট্যাট -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

4
আমি মনে করি যে ওপি কনসোল নয় এমন একটি এনপিএম স্ক্রিপ্ট বিকল্পের সন্ধান করছে।
ফারাজি অ্যান্ডারসন

5

আপনি যদি ইতিমধ্যে চেষ্টা করে থাকেন ctrl + cএবং এটি এখনও কাজ না করে, আপনি এটি চেষ্টা করতে পারেন। এটি আমার পক্ষে কাজ করেছে।

  1. প্রশাসক হিসাবে কমান্ড-লাইন চালান। তারপরে আপনি যে প্রসেসিডটি (পিআইডি) হত্যা করতে চান তা খুঁজতে নীচের কমান্ডটি চালান। আপনার পোর্ট নম্বরটি টাইপ করুন<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

এখানে চিত্র বর্ণনা লিখুন

  1. তারপরে আপনি পিআইডি সনাক্ত করার পরে আপনি এই আদেশটি কার্যকর করেন।

    taskkill /PID <typeYourPIDhere> /F

এখানে চিত্র বর্ণনা লিখুন

@Mit যশ থেকে ingh $ http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157


4

পূর্ববর্তী উত্তরগুলি থেকে ধারণাগুলি মিশ্রিত করে এমন আরও একটি সমাধান এখানে। প্ল্যাটফর্মের স্বাধীনতা সম্পর্কিত উদ্বেগকে সম্বোধন করার সময় এটি "কিল প্রক্রিয়া" পদ্ধতির প্রয়োজন।

এটি সার্ভার প্রক্রিয়া ট্রি হত্যার জন্য ট্রি-কিল প্যাকেজের উপর নির্ভর করে । আমি আমার প্রকল্পগুলিতে প্রয়োজনীয় পুরো প্রক্রিয়া গাছটিকে হত্যা করতে পেয়েছি কারণ কিছু সরঞ্জাম (উদাঃ 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'
  })
}

বিল্ড / স্টপ-সার্ভার.জেএস

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সার্ভারটি বন্ধ না হওয়া অবধি অবিলম্বে ফিরে আসবে এবং অবরুদ্ধ হবে না)। আপনি যদি theতিহ্যবাহী অবরুদ্ধ আচরণ পছন্দ করেন তবে কেবল options.detachedযুক্তি spawn()এবং কলটি সরিয়ে দিন child.unref()


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

2

উইন্ডোজ মেশিনের জন্য (আমি উইন্ডোজ 10 এ আছি), যদি সিটিআরএল + সি (বাতিল / বাতিল) ক্লিমে কমান্ডটি কাজ করে না, এবং স্ক্রিনটি এর মতো প্রদর্শিত হবে:

এখানে চিত্র বর্ণনা লিখুন

প্রথমে ENTER হিট করার চেষ্টা করুন (বা কোনও কী এটি করবে) এবং তারপরে CTRL + C এবং বর্তমান প্রক্রিয়াটি জিজ্ঞাসা করবে আপনি ব্যাচের কাজটি শেষ করতে চান কিনা:

এখানে চিত্র বর্ণনা লিখুন

এনটিএম প্রারম্ভিক অন্যান্য শিশু প্রসেসের সাথে চললে সম্ভবত সিটিআরএল + সি কেবলমাত্র পিতামাতার প্রক্রিয়াটি বন্ধ করে দেয়। CTRL + C এর পূর্বে আপনাকে কেন অতিরিক্ত কীটি চাপতে হবে তা বেশ নিশ্চিত নয় তবে কমান্ড লাইনটি বন্ধ করে আবার শুরু করার চেয়ে এটি আরও ভাল কাজ করে।

সম্পর্কিত যে সমস্যাটি আপনি যাচাই করতে চাইতে পারেন: https://github.com/mysticatea/npm-run-all/issues/74


1

অ্যাপ্লিকেশনটি বন্ধ করার জন্য আপনার জসন ফাইলে কোনও স্ক্রিপ্ট না থাকলে, আমি যে বিকল্পটি ব্যবহার করি সেটি কেবলমাত্র সেন্টিমিটারে ctrl + C টিপুন by


0

উত্পাদন পরিবেশের জন্য আপনার Forever.js ব্যবহার করা উচিত

এটি নোড প্রক্রিয়া শুরু এবং স্টপ করার জন্য এতটাই দরকারী, আপনি খুব বেশি চলমান অ্যাপ্লিকেশনগুলির তালিকা করতে পারেন।

https://github.com/foreverjs/forever



-1

সমস্ত (3) একাকীকরণ হ'ল:

1- সিটিএলআর + সি

2- জেসন ফাইলটিতে একটি স্ক্রিপ্ট নষ্ট হয়ে যায় stop

"স্ক্রিপ্টস": stop "থামুন": "কিল্লাল-এই-নাম-হিসাবে-এটি-হওয়া দরকার-হিসাবে-এটি-হওয়া দরকার"},

কমান্ড লেখার চেয়ে // এনপিএম স্টপ //

3- পিসি পুনরায় চালু করুন


7
পিসি পুনরায় চালু করুন , সত্যিই?!? কেন কেবল মূল সার্কিট ব্রেকারটি ফ্লিপ করবেন না? : ডি
স্টক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.