วิธีหยุดแอปที่ node.js แสดง 'npm start'


104

คุณสร้าง app Node.js กับ v4.x ด่วนแล้วเริ่ม app ของคุณโดยการเริ่มต้น NPM คำถามของฉันคือจะหยุดแอปได้อย่างไร? มีnpm หยุดไหม

แก้ไขเพื่อรวมข้อผิดพลาดเมื่อใช้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

คำตอบ:


66

ใช่ npm มีสคริปต์หยุดด้วย:

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หรือบางอย่างที่จัดการสิ่งนี้โดยอัตโนมัติบนพื้นฐานของการกดคอมไพล์


ยังคงมีข้อผิดพลาด เห็นได้ชัดว่าฉันมีความเชี่ยวชาญในคำสั่งบรรทัด
ngungo

@ngungo ค่อนข้าง--signal. ใช้man pkillอ่านเกี่ยวกับ pkill
Evan Carroll

3
@EvanCarroll จะเกิดอะไรขึ้นหากแอพทำงานหลายอินสแตนซ์
Amit Kumar Gupta

1
ความคิดใด ๆ ที่จะใช้สิ่งนี้ในแอพ angular 4 ฉันจะตั้งชื่อกระบวนการได้อย่างไร
kiranghule27

41

โซลูชันอื่น ๆ ทั้งหมดที่นี่ขึ้นอยู่กับระบบปฏิบัติการ โซลูชันอิสระสำหรับ OS ใด ๆ ใช้ 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
ความสวยงามของแนวทางนี้คือโดยพื้นฐานแล้วคุณสามารถใช้งานได้บน env ใด ๆ รวมถึงคอนเทนเนอร์ซึ่งโดยปกติจะค่อนข้าง จำกัด วิธีที่คุณจัดการกับกระบวนการ จากมุมมองส่วนตัวของฉันนั่นคือแนวทางที่สง่างามที่สุด
Der Zinger

สวยมาก
mondlos

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

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
ฉันคิดว่า OP กำลังมองหาตัวเลือกสคริปต์ NPM ไม่ใช่คอนโซล
Faraji Anderson

5

หากคุณได้ลองแล้วctrl + cแต่ยังไม่ได้ผลคุณอาจต้องลองทำเช่นนี้ สิ่งนี้ได้ผลสำหรับฉัน

  1. เรียกใช้บรรทัดคำสั่งในฐานะผู้ดูแลระบบ จากนั้นรันคำสั่งด้านล่างเพื่อค้นหา processID (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


4

นี่คืออีกวิธีหนึ่งที่ผสมผสานแนวคิดจากคำตอบก่อนหน้านี้ ใช้แนวทาง "กระบวนการฆ่า" ในขณะที่จัดการกับข้อกังวลเกี่ยวกับความเป็นอิสระของแพลตฟอร์ม

มันอาศัยแพ็กเกจtree-killเพื่อจัดการกับการฆ่าทรีกระบวนการของเซิร์ฟเวอร์ ฉันพบว่าการฆ่าโครงสร้างกระบวนการทั้งหมดเป็นสิ่งที่จำเป็นในโครงการของฉันเพราะเครื่องมือบางอย่าง (เช่นbabel-node) วางไข่กระบวนการย่อย หากคุณต้องการฆ่าเพียงกระบวนการเดียวคุณสามารถแทนที่การฆ่าต้นไม้ด้วยprocess.kill()วิธีการในตัว

วิธีแก้ปัญหาดังต่อไปนี้ ( spawn()ควรแก้ไขอาร์กิวเมนต์สองรายการแรกเพื่อให้สอดคล้องกับสูตรเฉพาะสำหรับการเรียกใช้เซิร์ฟเวอร์ของคุณ):

สร้าง / 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'
  })
}

สร้าง / หยุดเซิร์ฟเวอร์ 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()


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

สำหรับเครื่อง windows (ฉันใช้ windows 10) ถ้าคำสั่ง CTRL + C (ยกเลิก / ยกเลิก) บน cli ไม่ทำงานและหน้าจอจะแสดงขึ้นมาดังนี้:

ป้อนคำอธิบายภาพที่นี่

พยายามกด ENTER ก่อน (หรือคีย์ใด ๆ ก็ได้) จากนั้น CTRL + C และกระบวนการปัจจุบันจะถามว่าคุณต้องการยุติงานแบทช์หรือไม่:

ป้อนคำอธิบายภาพที่นี่

บางที CTRL + C จะยุติกระบวนการพาเรนต์เท่านั้นในขณะที่ npm start รันกับโปรเซสลูกอื่น ค่อนข้างไม่แน่ใจว่าทำไมคุณต้องกดคีย์พิเศษนั้นก่อน CTRL + C แต่มันทำงานได้ดีกว่าการปิดบรรทัดคำสั่งแล้วเริ่มใหม่อีกครั้ง

ปัญหาที่เกี่ยวข้องที่คุณอาจต้องการตรวจสอบ: https://github.com/mysticatea/npm-run-all/issues/74


1

ในกรณีที่ไฟล์ json ของคุณไม่มีสคริปต์สำหรับหยุดแอปตัวเลือกที่ฉันใช้ก็แค่กด ctrl + C บน cmd


0

สำหรับสภาพแวดล้อมการใช้งานจริงคุณควรใช้ Forever.js

มันมีประโยชน์มากสำหรับการเริ่มต้นและหยุดกระบวนการโหนดคุณสามารถแสดงรายการแอพที่ทำงานได้ด้วย

https://github.com/foreverjs/forever



-1

ความโดดเดี่ยวทั้งหมด (3) คือ:

1- ctlr + C

2- ในไฟล์ json เขียนสคริปต์ที่หยุด

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

* กว่าในคำสั่งเขียน // npm stop //

3- รีสตาร์ทพีซี


7
รีสตาร์ทเครื่องพีซีจริงเหรอ!? ทำไมไม่เพียงแค่พลิกเบรกเกอร์หลัก? : D
stk

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.