Bagaimana cara menghentikan aplikasi yang node.js mengekspresikan 'npm start'

100

Anda membangun aplikasi node.js dengan express v4.x lalu memulai aplikasi Anda dengan npm start . Pertanyaan saya adalah bagaimana cara menghentikan aplikasi? Apakah ada npm stop ?

EDIT untuk menyertakan kesalahan saat menerapkan 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
ngungo
sumber

Jawaban:

66

Ya, npm juga menyediakan skrip stop:

npm help npm-scripts

prestop, stop, poststop: Jalankan dengan perintah npm stop.

Tetapkan salah satu dari yang di atas di package.json Anda, lalu gunakan npm stop

npm help npm-stop

Anda dapat membuatnya sangat sederhana jika Anda mengatur app.js,

process.title = myApp;

Dan, lalu di scripts.json,

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

Yang mengatakan, jika ini saya, saya akan menggunakan pm2atau sesuatu yang secara otomatis menangani ini berdasarkan git push.

Evan Carroll
sumber
Masih ada kesalahan. Jelas saya fasih dalam perintah baris.
ngungo
@ngo lebih tepatnya --signal. Gunakan man pkilluntuk membaca tentang pkill.
Evan Carroll
3
@EvanCarroll Bagaimana jika beberapa contoh aplikasi sedang berjalan?
Amit Kumar Gupta
1
Tahu bagaimana menerapkan ini dalam aplikasi 4 sudut. Khususnya di mana saya mengatur judul proses?
kiranghule27
40

Semua solusi lain di sini bergantung pada OS. Solusi independen untuk OS apa pun menggunakan socket.io sebagai berikut.

package.json memiliki dua skrip:

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

server.js - Barang ekspres Anda yang biasa ada di sini

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

Ujilah

npm start (untuk memulai server Anda seperti biasa)

npm stop (ini sekarang akan menghentikan server Anda yang sedang berjalan)

Kode di atas belum diuji (ini adalah versi potongan dari kode saya, kode saya berfungsi) tetapi semoga berfungsi sebagaimana mestinya. Either way, ini memberikan arahan umum yang harus diambil jika Anda ingin menggunakan socket.io untuk menghentikan server Anda.

danday74
sumber
2
Keunggulan dari pendekatan ini adalah pada dasarnya Anda dapat menjalankannya di env apa pun, termasuk container, yang biasanya cukup membatasi cara Anda memanipulasi proses. Dari perspektif saya yang sangat pribadi - itu adalah pendekatan yang paling elegan.
Der Zinger
16

Ketika saya mencoba solusi yang disarankan, saya menyadari bahwa nama aplikasi saya terpotong. Saya membaca process.titledi dokumentasi nodejs ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) dan dikatakan

Di Linux dan OS X, ini terbatas pada ukuran nama biner ditambah panjang argumen baris perintah karena menimpa memori argv.

Aplikasi saya tidak menggunakan argumen apa pun, jadi saya dapat menambahkan baris kode ini ke file app.js

process.title = process.argv[2];

dan kemudian tambahkan beberapa baris ini ke package.jsonfile saya

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

untuk menggunakan nama proses yang sangat panjang. npm startdan npm stopbekerja, tentu saja npm stopakan selalu menghentikan semua proses yang berjalan, tetapi tidak masalah bagi saya.


sumber
12

Ini adalah masalah versi mintty atau gunakan cmd. Untuk menghentikan proses server cukup jalankan perintah ini:

    taskkill -F -IM node.exe
Karan
sumber
2
bukan ide yang baik untuk mematikan node.exe utama karena akan menimbulkan masalah jika Anda memiliki beberapa aplikasi node yang berjalan
user889030
11

Di MAC OS X (/ BSD): Anda dapat mencoba menggunakan perintah lsof (daftar file yang terbuka)

$ sudo lsof -nPi -sTCP:LISTEN

masukkan deskripsi gambar di sini

sehingga

$ kill -9 3320
pemenang
sumber
9

Periksa dengan netstat -nptl semua proses

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 

Dan itu hanya membunuh proses dengan referensi PID .... Dalam kasus saya, saya ingin menghentikan 6231 / nodejs jadi saya menjalankan perintah berikut:

kill -9 6231
Samuel Ivan
sumber
1
Saya pikir OP mencari opsi skrip NPM bukan konsol.
Faraji Anderson
4

Berikut solusi lain yang mencampurkan ide dari jawaban sebelumnya. Dibutuhkan pendekatan "proses pembunuhan" sambil menangani kekhawatiran tentang kemandirian platform.

Ini bergantung pada paket penghentian pohon untuk menangani pembunuhan pohon proses server. Saya merasa perlu membunuh seluruh pohon proses dalam proyek saya karena beberapa alat (misalnya babel-node) menelurkan proses anak. Jika Anda hanya perlu mematikan satu proses, Anda dapat mengganti tree-kill dengan process.kill()metode bawaan.

Solusinya mengikuti (dua argumen pertama yang spawn()harus dimodifikasi untuk mencerminkan resep khusus untuk menjalankan server Anda):

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

Perhatikan bahwa solusi ini melepaskan skrip mulai dari server (yaitu npm startakan segera kembali dan tidak memblokir hingga server dihentikan). Jika Anda lebih suka perilaku pemblokiran tradisional, cukup hapus options.detachedargumen ke spawn()dan panggilan ke child.unref().

Rusty Shackleford
sumber
3

Jika Anda sudah mencoba ctrl + cdan masih tidak berhasil, Anda mungkin ingin mencobanya. Ini berhasil untuk saya.

  1. Jalankan baris perintah sebagai Administrator. Kemudian jalankan perintah di bawah ini untuk menemukan processID (PID) yang ingin Anda matikan. Ketik nomor port Anda<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

masukkan deskripsi gambar di sini

  1. Kemudian Anda menjalankan perintah ini setelah Anda mengidentifikasi PID.

    taskkill /PID <typeYourPIDhere> /F

masukkan deskripsi gambar di sini

Kudos untuk @mit $ ingh dari http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157

Jamezuh
sumber
2

Jika sangat sederhana, matikan saja prosesnya ..

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
rogersfo
sumber
1

Untuk mesin windows (saya di windows 10), jika CTRL + C (Cancel / Abort) Command di cli tidak berfungsi, dan layar akan muncul seperti ini:

masukkan deskripsi gambar di sini

Cobalah untuk menekan ENTER terlebih dahulu (atau tombol apa saja akan melakukannya) lalu CTRL + C dan proses saat ini akan menanyakan apakah Anda ingin menghentikan pekerjaan batch:

masukkan deskripsi gambar di sini

Mungkin CTRL + C hanya menghentikan proses induk sementara npm mulai berjalan dengan proses anak lainnya. Cukup tidak yakin mengapa Anda harus menekan tombol ekstra itu sebelum CTRL + C, tetapi ini bekerja lebih baik daripada harus menutup baris perintah dan memulai lagi.

Masalah terkait yang mungkin ingin Anda periksa: https://github.com/mysticatea/npm-run-all/issues/74

Vincent Edward Gedaria Binua
sumber
0

Untuk lingkungan produksi, Anda harus menggunakan Forever.js

Ini sangat berguna untuk memulai dan menghentikan proses node, Anda dapat membuat daftar aplikasi yang berjalan juga.

https://github.com/foreverjs/forever

Carlos Jesus Arancibia Taborga
sumber
0

Jika file json Anda tidak memiliki skrip untuk menghentikan aplikasi, opsi yang saya gunakan hanya dengan menekan ctrl + C pada cmd.

Felipe
sumber
-1

Semua (3) pelarutan adalah:

1- ctlr + C

2- Dalam file json ada skrip yang berhenti

"scripts": {"stop": "killall -SIGINT nama-bisa-bisa-as-selama-itu-perlu-untuk-menjadi"},

* daripada di perintah tulis // npm stop //

3- Mulai ulang pc

Omar bakhsh
sumber
7
Nyalakan kembali pc , benarkah?!? Mengapa tidak membalik saja pemutus arus utama? : D
stk
-2

Anda harus menekan kombinasi ctrl + z OS saya adalah Ubuntu

Тимур Сафаров
sumber