Cách dừng ứng dụng mà node.js thể hiện 'npm start'


100

Bạn xây dựng ứng dụng node.js với express v4.x, sau đó khởi động ứng dụng của bạn trước npm start . Câu hỏi của tôi là làm thế nào để dừng ứng dụng? Có dừng npm không ?

CHỈNH SỬA để bao gồm lỗi khi triển khai npm dừng

/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

Câu trả lời:


66

Có, npm cũng cung cấp cho một tập lệnh dừng:

npm help npm-scripts

prestop, stop, poststop: Chạy bằng lệnh npm stop.

Đặt một trong các tùy chọn trên trong package.json của bạn, rồi sử dụng npm stop

npm help npm-stop

Bạn có thể thực hiện điều này thực sự đơn giản nếu bạn thiết lập app.js,

process.title = myApp;

Và, sau đó trong scripts.json,

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

Điều đó nói rằng, nếu đây là tôi, tôi sẽ sử dụng pm2hoặc thứ gì đó tự động xử lý điều này trên cơ sở một git push.


Vẫn có lỗi. Rõ ràng là tôi rất thông thạo các lệnh dòng.
ngungo

@ngungo thì đúng hơn --signal. Sử dụng man pkillđể đọc về pkill.
Evan Carroll

3
@EvanCarroll Điều gì sẽ xảy ra nếu nhiều phiên bản ứng dụng đang chạy?
Amit Kumar Gupta,

1
Bất kỳ ý tưởng nào về cách thực hiện điều này trong ứng dụng angle 4. Cụ thể tôi phải đặt tiêu đề quy trình ở đâu?
kiranghule27

40

Tất cả các giải pháp khác ở đây đều phụ thuộc vào hệ điều hành. Một giải pháp độc lập cho bất kỳ hệ điều hành nào sử dụng socket.io như sau.

package.json có hai tập lệnh:

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

server.js - Nội dung express thông thường của bạn có ở đây

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);
});

Kiểm tra nó ra

npm start (để khởi động máy chủ của bạn như bình thường)

npm stop (điều này sẽ dừng máy chủ đang chạy của bạn)

Đoạn mã trên chưa được thử nghiệm (nó là một phiên bản cắt giảm của mã của tôi, mã của tôi hoạt động) nhưng hy vọng nó hoạt động như vậy. Dù bằng cách nào, nó cung cấp hướng chung cần thực hiện nếu bạn muốn sử dụng socket.io để dừng máy chủ của mình.


2
Cái hay của cách tiếp cận này là về cơ bản bạn có thể chạy nó trên bất kỳ env nào, kể cả vùng chứa, thường khá hạn chế đối với cách bạn thao tác các quy trình. Theo quan điểm cá nhân của tôi - đó là cách tiếp cận thanh lịch nhất.
Der Zinger

16

Khi tôi thử giải pháp được đề xuất, tôi nhận ra rằng tên ứng dụng của tôi đã bị cắt ngắn. Tôi đọc tiếp process.titletrong tài liệu nodejs ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) và nó cho biết

Trên Linux và OS X, nó bị giới hạn ở kích thước của tên nhị phân cộng với độ dài của các đối số dòng lệnh vì nó ghi đè lên bộ nhớ argv.

Ứng dụng của tôi không sử dụng bất kỳ đối số nào, vì vậy tôi có thể thêm dòng mã này vào app.js

process.title = process.argv[2];

và sau đó thêm vài dòng này vào package.jsontệp của tôi

  "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"
  },

để sử dụng các tên quy trình thực sự dài. npm startnpm stoplàm việc, tất nhiên npm stopsẽ luôn chấm dứt tất cả các tiến trình đang chạy, nhưng điều đó là ổn đối với tôi.


12

Đây là một vấn đề về phiên bản bạc hà, hoặc sử dụng cmd. Để giết tiến trình máy chủ, chỉ cần chạy lệnh này:

    taskkill -F -IM node.exe

1
không nên giết main node.exe vì nó sẽ tạo ra vấn đề trong trường hợp bạn có nhiều ứng dụng node đang chạy
user889030

11

Trên MAC OS X (/ BSD): bạn có thể thử sử dụng lệnh lsof (danh sách các tệp đang mở)

$ sudo lsof -nPi -sTCP:LISTEN

nhập mô tả hình ảnh ở đây

và vì thế

$ kill -9 3320

9

Kiểm tra bằng netstat -nptl tất cả các quy trình

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 

Và nó chỉ đơn giản là giết quá trình bằng tham chiếu PID .... Trong trường hợp của tôi, tôi muốn dừng 6231 / nodejs, vì vậy tôi thực hiện lệnh sau:

kill -9 6231

1
Tôi nghĩ OP đang tìm kiếm một tùy chọn tập lệnh NPM không phải bảng điều khiển.
Faraji Anderson

4

Đây là một giải pháp khác kết hợp các ý tưởng từ các câu trả lời trước. Nó sử dụng cách tiếp cận "quá trình tiêu diệt" trong khi giải quyết mối quan tâm về tính độc lập của nền tảng.

Nó dựa vào gói diệt cây để xử lý việc giết cây xử lý máy chủ. Tôi thấy việc giết toàn bộ cây quy trình là cần thiết trong các dự án của mình vì một số công cụ (ví dụ babel-node) sinh ra các quy trình con. Nếu bạn chỉ cần diệt một quy trình duy nhất, bạn có thể thay thế diệt cây bằng process.kill()phương pháp tích hợp sẵn.

Giải pháp sau (hai đối số đầu tiên spawn()cần được sửa đổi để phản ánh công thức cụ thể để chạy máy chủ của bạn):

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)

package.json

"scripts": {
  "start": "babel-node build/start-server.js",
  "stop": "babel-node build/stop-server.js"
}

Lưu ý rằng giải pháp này tách tập lệnh bắt đầu khỏi máy chủ (tức là npm startsẽ trả về ngay lập tức và không chặn cho đến khi máy chủ bị dừng). Nếu bạn thích hành vi chặn truyền thống, chỉ cần xóa options.detachedđối số tới spawn()và lệnh gọi tới child.unref().


3

Nếu bạn đã thử ctrl + cmà vẫn không hiệu quả, bạn có thể muốn thử cách này. Điều này đã làm việc cho tôi.

  1. Chạy dòng lệnh với tư cách Quản trị viên. Sau đó chạy lệnh bên dưới để tìm processID (PID) mà bạn muốn giết. Nhập số cổng của bạn vào<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

nhập mô tả hình ảnh ở đây

  1. Sau đó, bạn thực hiện lệnh này sau khi bạn đã xác định được PID.

    taskkill /PID <typeYourPIDhere> /F

nhập mô tả hình ảnh ở đây

Kudos để @mit $ ingh từ http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157


2

Nếu rất đơn giản, chỉ cần giết quá trình ..

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

Đối với máy windows (tôi đang sử dụng windows 10), nếu lệnh CTRL + C (Cancel / Abort) trên cli không hoạt động và màn hình hiển thị như sau:

nhập mô tả hình ảnh ở đây

Trước tiên, hãy thử nhấn ENTER (hoặc bất kỳ phím nào), sau đó nhấn CTRL + C và quy trình hiện tại sẽ hỏi bạn có muốn chấm dứt công việc hàng loạt hay không:

nhập mô tả hình ảnh ở đây

Có lẽ CTRL + C chỉ kết thúc quy trình mẹ trong khi npm start chạy với các quy trình con khác. Khá không chắc chắn tại sao bạn phải nhấn phím bổ sung đó mặc dù trước CTRL + C, nhưng nó hoạt động tốt hơn so với việc phải đóng dòng lệnh và bắt đầu lại.

Một vấn đề liên quan bạn có thể muốn kiểm tra: https://github.com/mysticatea/npm-run-all/issues/74




0

Trong trường hợp tệp json của bạn không có tập lệnh để dừng ứng dụng, một tùy chọn mà tôi sử dụng chỉ là nhấn ctrl + C trên cmd.


-1

Tất cả (3) solotion là:

1- ctlr + C

2- trong tệp json phá hỏng một tập lệnh dừng

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

* than trong lệnh ghi // npm dừng //

3- Khởi động lại máy tính


7
Khởi động lại máy tính , thực sự?!? Tại sao không chỉ lật cầu dao chính? : D
stk

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.