Node.js'nin "npm start" ifadesini ifade ettiği uygulama nasıl durdurulur


101

Express v4.x ile node.js uygulaması oluşturursunuz, ardından uygulamanızı npm start ile başlatırsınız . Sorum, uygulamayı nasıl durduracağım? Orada mı npm durağı ?

Npm durdurma uygularken hatayı dahil etmek için DÜZENLE

/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

Yanıtlar:


66

Evet, npm bir durdurma betiği de sağlar:

npm help npm-scripts

prestop, stop, poststop: npm stop komutuyla çalıştırın.

Yukarıdakilerden birini package.json dosyanıza ayarlayın ve ardından npm stop

npm help npm-stop

Ayarladığınızda bunu gerçekten basitleştirebilirsiniz app.js,

process.title = uygulamam;

Ve sonra scripts.json'da,

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

Bununla birlikte, eğer bu ben olsaydım, bunu kullanırdım pm2ya da bunu bir git itme temelinde otomatik olarak ele alırdım .


Hala hata var. Açıkçası, satır komutları konusunda çok bilgiliyim.
ngungo

@ngungo yerine --signal. man pkillPkill hakkında bilgi almak için kullanın .
Evan Carroll

3
@EvanCarroll Birden fazla uygulama örneği çalışıyorsa ne olur?
Amit Kumar Gupta

1
Bunun açısal 4 uygulamasında nasıl uygulanacağı hakkında herhangi bir fikir. Özellikle işlem başlığını nerede oluşturabilirim?
kiranghule27

40

Buradaki diğer tüm çözümler işletim sistemine bağlıdır. Herhangi bir işletim sistemi için bağımsız bir çözüm, aşağıdaki gibi socket.io'yu kullanır.

package.json iki komut dosyasına sahiptir:

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

server.js - Her zamanki ekspres dosyalarınız burada yaşıyor

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

Test edin

npm start (sunucunuzu her zamanki gibi başlatmak için)

npm stop (bu şimdi çalışan sunucunuzu durduracaktır)

Yukarıdaki kod test edilmemiştir (kodumun kısaltılmış bir sürümüdür, kodum çalışır) ama umarım olduğu gibi çalışır. Her iki durumda da, sunucunuzu durdurmak için socket.io'yu kullanmak istiyorsanız, izlenecek genel yönü sağlar.


2
Bu yaklaşımın güzelliği, temelde bunu herhangi bir ortamda çalıştırabilmenizdir, kapsayıcılar da dahil olmak üzere, genellikle süreçleri nasıl manipüle ettiğiniz konusunda oldukça kısıtlayıcıdır. Benim kişisel bakış açıma göre - bu en zarif yaklaşım.
Der Zinger

16

Önerilen çözümü denediğimde uygulama adımın kısaltıldığını fark ettim. Ben kadar okumak process.titlenodejs belgelerinde ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) ve diyor

Linux ve OS X'de, argv belleğinin üzerine yazdığı için ikili adın boyutu artı komut satırı argümanlarının uzunluğu ile sınırlıdır.

Uygulamam herhangi bir bağımsız değişken kullanmıyor, bu nedenle bu kod satırını benim app.js

process.title = process.argv[2];

ve sonra benim için bu birkaç satır eklemek package.jsondosyası

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

gerçekten uzun süreç isimleri kullanmak. npm startve npm stopiş, tabii ki npm stopher zaman çalışan tüm süreçleri sonlandırır, ama bu benim için sorun değil.


12

Bu küçük bir sürüm problemidir, alternatif olarak cmd kullanın. Sunucu sürecini sonlandırmak için şu komutu çalıştırın:

    taskkill -F -IM node.exe

2
Birden fazla düğüm uygulamasının çalışması durumunda sorun yaratacağından main node.exe'yi öldürmek iyi bir fikir değil
user889030

11

MAC OS X'te (/ BSD): lsof (açık dosyaları listele) komutunu kullanmayı deneyebilirsiniz.

$ sudo lsof -nPi -sTCP:LISTEN

görüntü açıklamasını buraya girin

ve bu yüzden

$ kill -9 3320

9

Netstat -nptl ile tüm süreçleri kontrol edin

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 

Ve işlemi basitçe PID referansı ile sonlandırıyor .... Benim durumumda 6231 / nodejs'yi durdurmak istiyorum, bu yüzden aşağıdaki komutu çalıştırıyorum:

kill -9 6231

1
Bence OP, konsol değil bir NPM komut dosyası seçeneği arıyor.
Faraji Anderson

4

İşte önceki cevaplardan gelen fikirleri karıştıran başka bir çözüm. Platform bağımsızlığı endişesini ele alırken "öldürme süreci" yaklaşımını benimsiyor.

Sunucu işlem ağacını sonlandırmak için ağaç öldürme paketine güvenir . Projelerimde tüm süreç ağacını öldürmeyi gerekli buldum çünkü bazı araçlar (örneğin babel-node) çocuk süreçleri ortaya çıkarıyor. Yalnızca tek bir işlemi öldürmeniz gerekiyorsa, ağaç öldürmeyi yerleşik process.kill()yöntemle değiştirebilirsiniz.

Çözüm şu şekildedir ( spawn()sunucunuzu çalıştırmak için özel tarifi yansıtacak şekilde değiştirilecek ilk iki argüman ):

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

Bu çözümün başlangıç ​​komut dosyasını sunucudan ayırdığını unutmayın (yani npm start, hemen dönecek ve sunucu durdurulana kadar engellenmeyecektir). Geleneksel engelleme davranışını tercih ediyorsanız, options.detachedargümanını spawn()ve çağrısını kaldırmanız yeterlidir child.unref().


3

Zaten denediyseniz ctrl + cve hala çalışmıyorsa, bunu denemek isteyebilirsiniz. Bu benim için çalıştı.

  1. Yönetici olarak komut satırını çalıştırın. Ardından, öldürmek istediğiniz işlem kimliğini (PID) bulmak için aşağıdaki komutu çalıştırın. Bağlantı noktası numaranızı yazın<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

görüntü açıklamasını buraya girin

  1. Ardından PID'yi belirledikten sonra bu komutu yürütürsünüz.

    taskkill /PID <typeYourPIDhere> /F

görüntü açıklamasını buraya girin

@Mit Şeref gelen ingh, $ http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157


2

Çok basitse, işlemi sonlandırın ..

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 makinesi için (Windows 10'dayım), cli'de CTRL + C (İptal / İptal) Komutu çalışmazsa ve ekran şu şekilde görünürse:

görüntü açıklamasını buraya girin

Önce ENTER tuşuna basmayı deneyin (veya herhangi bir tuş işe yarar) ve ardından CTRL + C ve mevcut işlem toplu işi sonlandırmak isteyip istemediğinizi sorar:

görüntü açıklamasını buraya girin

Belki de CTRL + C yalnızca üst süreci sonlandırırken npm start diğer alt süreçlerle çalışır. CTRL + C'den önce neden bu ekstra tuşa basmanız gerektiğinden pek emin değilim, ancak komut satırını kapatıp yeniden başlamak zorunda kalmaktan daha iyi çalışıyor.

Kontrol etmek isteyebileceğiniz ilgili bir sorun: https://github.com/mysticatea/npm-run-all/issues/74




0

Json dosyanızda uygulamayı durdurmak için bir komut dosyası yoksa, kullandığım bir seçenek cmd'de ctrl + C tuşlarına basmaktır.


-1

Tüm (3) çözüm:

1- ctlr + C

2- json dosyasında duran bir betik oluştur

"scripts": {"stop": "killall -SIGINT this-ad-gerektiği kadar-uzun-olabilir"},

* komut yazısından daha // npm durdur //

3- Bilgisayarı yeniden başlatın


7
Bilgisayarı yeniden başlatın , gerçekten mi?!? Neden ana devre kesiciyi çevirmiyorsunuz? : D
stk

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.