Node.js programını komut satırından durdurma


304

Bir bağlantı noktasını dinleyen basit bir TCP sunucum var.

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

node server.jsMac ile Ctrl + Z ile başlayıp kapatıyorum. Ben ile tekrar çalıştırmak çalıştığınızda node server.jsbu hata iletisini alıyorum:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)

Programı yanlış kapatıyor muyum? Bunun olmasını nasıl önleyebilirim?


2
Muhtemelen Ctrl-Z'nin * NIX üzerinde bir komutu askıya aldığını ve kapatmayacağını eklemeye değer . Eğer yazarsanız fgCtrl-Z sonra kaldığınız yerden, geri olacak. Yani önceki düğümünüz hala çalışıyor. Bunu diğer komutlar için de yapıp yapmadığınıza dikkat edin!
ruffin

1
@ruffin bu bir cevap olmalı. Ctrl+ZEylemi yaptıysanız fg, süreci canlandırmak ve daha sonra Ctrl+Cuygun şekilde öldürmek için uygun bir yöntem olabilir .
Metagraf

Yanıtlar:


393

Programı sonlandırmak için Ctrl+ kullanmanız gerekir C. Bunu yaparsanız SIGINT, programın zarif bir şekilde sona ermesini, dinlediği herhangi bir bağlantı noktasından bağlantısını kesmesini sağlar.

Ayrıca bakınız: https://superuser.com/a/262948/48624


21
Ctrl + Cbenim için çalışmıyor. Yalnızca ^Ckonsola yazılır ve program kapanmaz.
Eleeist

1
@Eleeist, Terminal olarak ne kullanıyorsun? Benim için harika çalışıyor.
Brad

2
@Eleeist, Muhtemelen anahtarlarınızı falan değiştirdiniz. Ctrl+Ciyi çalışıyor. Her durumda, bu gerçek probleminizden ayrı bir konudur. SuperUser.com'da "Ctrl + C çalışmıyor" sorusunu göndermelisiniz.
Brad

1
@ jt0dd Her zaman yapabilirsin kill -9, ama yapmazdım. Uygulamanızın hala bağlantı noktalarını açık tutan tek uygulama olduğundan emin misiniz? Bu problemi hiç yaşamadım. Başvurum biter bitmez bağlantılar derhal sonlandırılır. Uygulamanızın veya başka bir şeyin bu bağlantı noktasında devam edip etmediğini belirlemek için netstat'ı kullanırım.
Brad

1
Klavye dilini başka bir dilde kullanırken bu sorunla karşılaştım. Mac giriş dilinizin İngilizce olduğundan emin olun
Fa.Shapouri

325

Ctrl+ Zaskıya alır, yani hala çalışıyor olabilir.

Ctrl+ Caslında onu öldürecek.

manuel olarak da şu şekilde öldürebilirsiniz:

ps aux | grep node

İşlem kimliğini bulun (soldan ikinci):

kill -9 PROCESS_ID

Bu da işe yarayabilir

killall node

ctrl + c çalışır ancak bu komutların hiçbiri benim için çalışmaz. Neden bilmiyorum? Ve komut satırı çözümü arıyorum
kızgın kivi

7
Killall düğümü konusunda dikkatli olun, eğer onlar "düğüm" ile
eşleşirlerse

1
killall nodecevabınızda yukarı doğru hareket etmek isteyebilirsiniz çünkü bu gerçekten en kolay ve en güvenilir seçenektir (tüm örnekleri öldürmeye hazır olduğunuz sürece)
Boern

4
'killall' dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor. Bir şey mi kaçırıyorum?
Ayyash

Burada aynı ... Cevap yok mu? 'Killall' tanınmadı diyor. Diğer komutların hiçbiri de çalışmaz. Bilgisayarımı yeniden başlatmam gerekiyor mu yoksa ne?
Methodist

37

Veya alternatif olarak tüm bunları tek bir satırda yapabilirsiniz:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

'\ Snode \ s' içindeki düğümü başka bir işlem adıyla değiştirebilirsiniz.


2
dönüşümlü olarak her zaman deneyebilirsiniz: ps -ef | grep "düğüm" | awk '{2 $ yazdır}' | xargs kill -9
frymaster

Çalışıyor gibi görünüyor ama beni istemine düzgün bir şekilde döndürmüyor. Düşünceler?
Şeytan'ın Avukatı

25

Süreci devam ettirin ve öldürün:

Ctrl+ Zaskıya alır, yani askıya alınmış bir arka plan işlemi olarak çalışıyor demektir.

Muhtemelen bir terminal istemindesiniz ...

  1. fgİşlemi ön planda devam ettirme komutunu verin .

  2. tip Ctrl+ Cdüzgün öldürmek için.


Alternatif olarak, manuel olarak şu şekilde öldürebilirsiniz:

( NOT: aşağıdaki komutlar root gerektirebilir, sudo ...arkadaşınız da olabilir)

pkill -9 node

veya pkill'iniz yoksa, bu işe yarayabilir:

killall node

veya belki de bu:

kill $(ps -e | grep node | awk '{print $1}')

bazen süreç kendi grep'ini listeleyecektir, bu durumda ihtiyacınız olacak:

kill $(ps -e | grep dmn | awk '{print $2}')

.


h / t @ruffin sorusunun kendisinin yorumlarından. Aynı sorunu yaşadım ve yorumu kendim çözmeme yardımcı oldu.


22

.exit js REPL düğümünden çıkmak için yazabilirsiniz


2
Bu , başlamak için REPL'de olduğunuzu varsayar . Çalışan bir Düğüm komut dosyası varsa ne olur?
IgorGanapolsky

18

Node.js'yi etkileşimli olarak çalıştırıyorsanız (REPL):

Ctrl+ Csizi istemine geri götürür ve şunu yazın:

process.exit()

veya sadece Ctrl+ kullanın D.


17

$ sudo killall nodebaşka bir terminal eserlerinde mac iken killall nodeçalışmıyor:

$ killall node
No matching processes belonging to you were found

13

linux üzerinde deneyin: pkill node

pencerelerde:

Taskkill /IM node.exe /F

veya

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])

5

Bu geç bir cevap olmasına rağmen, bunu NodeJS belgelerinden buldum :

'Çıkış' olayı, REPL'den .exitkomut girdi olarak alındığında, kullanıcı <ctrl>-CSIGINT'e sinyal vermek için iki kez basıldığında veya <ctrl>-Dgiriş akışında 'son' sinyali vermek için basıldığında yayılır . Dinleyici geri çağrısı hiçbir argüman olmadan çağrılır.

Özetlemek gerekirse:

  1. Yazma .exitnodejs repl içinde.
  2. <ctrl>-Cİki kez basmak .
  3. tuşuna basın <ctrl>-D.
  4. process.exit(0)yani REPL'den doğal çıkış. Başka bir durum döndürmek istiyorsanız, sıfır olmayan bir sayı döndürebilirsiniz.
  5. process.kill(process.pid) kodunuzdan veya REPL'den nodejs api kullanarak öldürmenin yoludur.

5

Bu yanıtı ekliyorum çünkü üretim dağıtımları olan birçok proje için, bu süreçleri durduran komut dosyalarımız var, bu yüzden yapmak zorunda değiliz.

Düğüm Sunucusu işlemlerinizi yönetmenin temiz bir yolu foreverpaketi (from NPM) kullanmaktır.

Misal:

Sonsuza kadar yükle

npm install forever -g

Düğüm Sunucusunu Çalıştır

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

Sonuç:

info: Forever processing file: server.js

Kapatma Düğümü Sunucusu

forever stop server.js

Sonuç

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247

Bu, Sunucu uygulamanızı temiz bir şekilde kapatır.



2

Birden fazla düğüm sunucusunun çalıştığı bir sorunla karşılaştım ve bunlardan birini öldürmek ve bir komut dosyasından yeniden dağıtmak istiyorum .

Not: Bu örnek Mac'te bir bash kabuğundadır.

Bunu yapmak için nodearamamı olabildiğince spesifik yaptığımdan emin olurum . Örneğin node server.js, uygulamalar dizininden aramak yerine ,node app_name_1/app/server.js

Sonra kullanarak öldürebilirim:

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

Bu yalnızca app_name_1 / app / server.js çalıştıran düğüm işlemini öldürür.

Eğer çalıştırırsanız node app_name_2/app/server.jsbu düğüm işlemi çalışmaya devam edecektir.

Onları öldürmek istediğinize karar verirseniz killall node, diğerlerinin de belirttiği gibi kullanabilirsiniz .


2

Geç cevap, ancak pencerelerde, CTRL + ALT + DEL ile görev yöneticisini açtıktan sonra Node.js işlemlerini öldürmek bu hatayı çözecektir.


2

localserver kill'de spesifik olmak için aşağıdaki komutu çalıştırabilirsiniz (burada: 8000)

http: // localhost: 8000 / kill PID (processId):

$:lsof -i tcp:8000

Size aşağıdaki TCP gruplarını verecektir:

KOMUT PID KULLANICI FD TİP CİHAZ BOYUTU / KAPALI BÜYÜK ADI

düğüm 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (LISTEN)

$:kill -9 21521

TCP *: 8000'e karşılık gelen processId öğesini öldürür


2

MacOS için

  1. Terminali aç
  2. Aşağıdaki kodu çalıştırın ve enter tuşuna basın

     sudo kill $(sudo lsof -t -i:4200)

2

Yapılmasını istediğiniz şeyi elde etmek için füzeri kullanabilirsiniz .

Bir bağlantı noktasında çalışan görevlerin işlem kimliklerini elde etmek için şunları yapabilirsiniz:

fuser <<target_port>>/tcp

Diyelim ki bağlantı noktası 8888, komut şöyle olur:

fuser 8888/tcp

Ve bir bağlantı noktasında çalışan bir işlemi öldürmek için -k anahtarını eklemeniz yeterlidir.

fuser <<target_port>>/tcp -k

Örnek (port 8888'dir):

fuser 8888/tcp -k

Bu kadar! Limanda dinleme işlemini kapatacak. Bunu genellikle sunucu uygulamamı çalıştırmadan önce yaparım.


1

Benim kullanım durumu: on MacOS , çalışma / yeniden birden düğüm sunucularını üzerinde farklı portlar bir komut dosyasından

çalıştırmak :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

stop1 :"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

stop2, stop3 ...

tekrar çalıştır :"stop1 & stop2 & ... & stopN ; run

bağlantı noktasından işlem bulma hakkında daha fazla bilgi için: Mac OS X'te belirli bir TCP bağlantı noktasını kim dinliyor?


0

Windows için önce bağlantı noktası numaranızla PID'yi arayın

netstat -ano | findStr "portNumber"

Bundan sonra, görevi öldürün, "c" sürücünüzün kökünde olduğunuzdan emin olun resim açıklamasını buraya girin ve komuttaskkill /F /PID your pid


0

önce VS Code ve terminal seçme düğümü kullanıyorsanız önce sağ taraftaki açılır menüden sonra Ctrl + C yapın.

resim açıklamasını buraya girin

İstendiğinde y tuşuna basın.

resim açıklamasını buraya girin

Teşekkürler

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.