Düğüm / Ekspres: EADDRINUSE, Adres zaten kullanılıyor - Kill server


442

Connect kullanarak node.js içinde çalışan basit bir sunucum var:

var server = require('connect').createServer();
//actions...
server.listen(3000);

Benim kodunda gerçek işleyicileri var, ama bu temel fikir. Sorunum devam ediyor

EADDRINUSE, Address already in use

Daha önce çöktükten veya hatalar sonra benim uygulama yeniden çalıştırırken bu hatayı alıyorum. Terminalin yeni bir örneğini açmadığım için işlemi kapatıyorum ctr + z.

Yapmam gereken tek şey sunucuyu veya bağlantıyı kapatmak olduğundan oldukça eminim. Aramaya çalıştım server.close()içinde process.on('exit', ...);hiç şansım.


39
Aslında, yerine SIGQUIT göndererek programı doğru kapatacak Ctrl + zkullanmak gerekir Ctrl + c:) Daha fazla bilgi için wiki bakın :)
nacho4d

1
SIGINT demek istiyorsun. SIGQUIT, `` ctrl + \ `
Xedecimal

53
Deneyin pkill nodejsya pkill nodeda UNIX benzeri işletim sistemlerinde ise
Gerard

1
Benzer bir sorun yaşadım ve CTRL + C'yi temizlediğinizde
Jazzy

1
1. Bağlantı noktasına takılan sarkan veya Ölü işlem kimliği varmış gibi görünüyor, Bu nedenle Düğüme Dayalı hizmet başlamıyor ve kullanım hatası vermiyor PORT IN USE (KULLANIM HATASI ADRESİ) 2. sunucuyu yeniden başlatmadan bağlantı noktası 10000.
abksharma

Yanıtlar:


147

process.on('exit', ..)süreç çökerse veya öldürülürse çağrılmaz. Yalnızca olay döngüsü sona erdiğinde çağrılır ve bir server.close() tür olay döngüsü sona erdiğinden (hala burada ve orada çalışan yığınları beklemek zorunda kalır) bunu çıkış etkinliğinin içine koymak mantıklı değildir ...

Çarpışmada yapın process.on('uncaughtException', ..)ve öldürünprocess.on('SIGTERM', ..)

Bununla birlikte, SIGTERM (varsayılan kill sinyali) uygulamanın temizlenmesine izin verirken, SIGKILL (hemen sonlandırma) uygulamanın hiçbir şey yapmasına izin vermez.


3
Ayrıca process.on ('SIGINT', ...) üzerinde yararlı kanca
farincz

487

Komut satırı yoluna da gidebilirsiniz:

ps aux | grep node

işlem kimliklerini almak için.

Sonra:

kill -9 PID

Öldürme sırasında -9 yapmak SIGKILL gönderir (SIGTERM yerine). SIGTERM benim için bazen düğüm tarafından göz ardı edildi.


1
ps aux | grep nodehiçbir şey göstermez; hala textareaserver --editor-cmd='gvim -f'başarısız: 14 Mar 21:19:30 - socket.io hazır - bağlantıları kabul ediyor Şimdi sunucuyu başlatabilir: EADDRINUSE, Adres zaten kullanılıyor
Jean Jordaan

75
Neden daha ziyadekillall -9 node
Martin Josefsson

1
pidofçok kullanışlı
JVE999

25
Bu cevabı uzun süre kullandım, sonra bir gün kolaylık sağlamak için tek bir astar haline getirdi .. bu komut belirli bir portta çalışan herhangi bir işlemi öldürecektir (bu örnekte 8000):lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
Aynı anda çalışan birden fazla düğüm sunucum vardı, bazıları Electron uygulamaları. Bunun killyerine sadece belirli işlem kimliği ile kullanmak zorunda kaldım killall.
tuliomir

229

İlk olarak, hangi işlemin kullanıldığını bilmek istersiniz port 3000

sudo lsof -i :3000

bu , bu bağlantı noktasındaki tüm PID dinlemelerini listeler , PID'ye sahip olduğunuzda aşağıdakilerle sonlandırabilirsiniz:

kill -9 {PID}

17
Bu komut ps aux | grep nodebenim için çıktısının aksine PID'yi açıkça tanımlar . Ayrıca ihtiyacım yoktusudo
Phil Gibbins

Bu en iyi cevap. İplikle React Native kullanarak, bağlantı noktası 8081 ile benim için iyi çalıştı.
Fernando Barbosa

Bu benim için harika çalıştı. 3000 numaralı bağlantı noktasının nerede kullanıldığını belirleyebilirim ve böylece kapatabilirim. Ayrıca ihtiyacım yoktu sudo.
Mart'ta Campalo

Çok iyi. Ayrıca komut aldıktan sonra çalıştı killall -9 {COMMAND}örneğinkillall -9 node
SOKAK PARA

vay benim için çalıştı
Anoop PS

162

Bunu win8 çalıştıran dizüstü bilgisayarımda vurdum. bu işe yaradı.

Cmd.exe dosyasını 'Yönetici' olarak çalıştırın:

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

Komut Penceresinden çalıştırıyordum ve yanlışlıkla kapattım. Düğüm arka planda çalışmaya devam etti ... (oturum sona erdikten sonra bile). Benim durumumda, web soketleri ile bağlanan tarayıcı sekmesini kapattıktan sonra sonunda sonlandırıldı.
Bertus Kruger

6
taskkill /F /IM node.exeherhangi bir dizinden Windows benim için bir cazibe gibi çalışır :-) Paylaşım için teşekkürler !!
Marty McGee

2
Bu, pencereler için doğrulayabildiğim tek satırlık çalışma çözümüdür
Code Whisperer

4
Windows 10 üzerinde çalışıyor. Ben cmd.exe yönetici btw olarak çalıştırmak zorunda değildi.
Glenn Werner

74

Aşağıdaki komutla PID'yi, 3000 numaralı bağlantı noktasında çalışan işlemin kimliğini kontrol edin:

lsof -i tcp:3000

Aşağıdaki gibi bir şey çıktı:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

Şimdi işlemi kullanarak şunu öldürün:

kill -9 5805

Bu sls çevrimdışı eklentisi kullanırken benim için çalıştı.
Junaid Atique

Bunun için teşekkürler! Tepki öğrenmeye yeni saatler önce başladım. :) Sunucuyu durdurduktan sonra, sadece bu tür hatalarla karşılaşmak için yeniden çalıştırdım.
Glenn

Kayıp kullanırsam çıkış almıyorum. Bu, o kısımda herhangi bir işlem olmadığı anlamına mı geliyor?
23:04


29

Linux

psDüğüm işleminizin PID'sini çalıştırın ve belirleyin.

O zaman koş sudo kill PID

pencereler

Çalışan işlemlerin listesini görüntülemek için görev listesini kullanın:

tasklist /O

Ardından, düğüm işlemini şu şekilde öldürün ( tasklistkomuttan elde edilen PID'yi kullanarak ):

taskkill /pid PID

1
Peki Windows'daysa?
Trevor

1
Bir not olarak ... nedense git-bash'dan taskkill komutu için bayraklarımda çift eğik çizgi kullanmak zorunda kaldım: taskkill //IM node.exe ve sadece düğümü öldürdüm. çalıştı.
nawlbergs

23

İşte bir astar (3000'i bir bağlantı noktası veya bir yapılandırma değişkeni ile değiştirin):

kill $(lsof -t -i:3000)

20

Bu hatayı bir kez alıyordum ve buradaki yaklaşımların çoğunu aldım.

Benim sorunlarım app.listen(3000);aynı app.js komut dosyasında iki çağrı vardı . İlk app.listen (), ikincisinin hatayı attığı yerde başarılı oldu.

Hata ayıklamama yardımcı sudo fuser -k 3000/tcpolan diğer bir yararlı komut , başlatmış olabileceğiniz herhangi bir haydut işlemi öldürecekti (bazı işlemler yeniden başlatılabilir, örneğin forever.js ile çalıştırılırsa, ancak benim için yararlıydı).


burada da aynı sorun ... çalıştırmak için bu hatayı alırken hata ayıklama düzgün çalışıyor garipnpm start
Asqan

16

Windows için Görev Yöneticisi'ni açın ve node.exe işlemlerini bulun. Son Görevi ile hepsini öldürün.

resim açıklamasını buraya girin


1
windows kullanıcıları için çok kolay ve karmaşık değil
momal

İşe yarıyor. Teşekkürler
Najathi

14
ps aux | grep node
kill -9 [PID] (provided by above command)

Açıklama:


  1. ps işlem durumunu verir, aux a: tüm kullanıcıların işlemleri, u: kullanıcının kendi işlemleri, x: terminale bağlı olmayan diğer tüm işlemlerin listesini sağlar.
  2. boru sembolü: | daha fazla manipüle etmek için ps aux sonucunu geçecektir.
  3. grep, ps aux tarafından sağlanan listeden sağlanan dizeyi (bizim durumumuzda düğüm) arayacaktır.

12

Bilginize, işlemi tek bir komutta öldürebilirsiniz sudo fuser -k 3000/tcp. Bu, geliştirme için yaygın olarak kullanılan 8000, 8080 veya 9000 gibi diğer tüm bağlantı noktaları için yapılabilir.



11

İlk olarak neyin çalıştığını öğrenin:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Gibi bir şey alacaksınız:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

Sonra süreci aşağıdaki gibi öldürebilirsiniz:

sudo kill 110

O zaman dinlemek EADDRINUSE ::: 3000 hataları almadan çalıştırmak mümkün olacak


Nodemon kullanıyorum ve hizmeti tekrar başlatıyor. Nodemon'u öldürmenin herhangi bir yolu var mı?
Smit Patel

10

Benim gibi Visual Studio Noobs için

İşlemi diğer terminallerde yapıyor olabilirsiniz!

Sonra kapanış Terminali Visual Studio , terminali sadece kaybolur .

Bir öncekinin yok edildiğini düşünerek manuel olarak yeni bir tane oluşturdum. Gerçekte, ben tıklayarak edildi her zaman Yeni Terminal I aslında edildi yaratan bir yenisini öncekilerin üstüne .

Bu yüzden ilk terminali buldum ve ... Voila, sunucuyu orada çalıştırıyordum.

çoklu terminaller bunu gerçekleştiriyor


1
Ah evet kardeşim.
Jaydeep Shil

8

Görev Yöneticisi (ctrl + alt + del) ->

İşlemler sekmesi ->

"node.exe" işlemini seçin ve "İşlemi Sonlandır" a basın


neden bir düğüm bağlantı noktası işlemini öldürmek istiyorsanız, tüm düğüm sürecini öldürmelisiniz.
Jimmy Obonyo Abor

8

İş parçacığını veya işlemi öldürmenin bile uygulamayı gerçekten sonlandırmayacağı senaryolarla karşılaşabilirsiniz (bu benim için Linux ve Windows'da arada bir olur). Bazen zaten çalışmadığınız bir örneği kapatmamış olabilirsiniz.

Bu tür koşulların bir sonucu olarak, aşağıdakileri eklemeyi tercih ederim package.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

Daha sonra bunları kullanarak arayabilirsiniz:

npm run stop-win
npm run stop-Linux

İsterseniz meraklısı alabilir ve bu BIN komutlarını bağımsız değişken bayrağıyla yapabilirsiniz. Bunları bir try-catch yan tümcesinde yürütülecek komutlar olarak da ekleyebilirsiniz.


5

Windows kullanıcıları ise: açık task managerve dosyanın, bu cezayı çalışır.end tasknodejs.exe


4

Sunucunuzun kilitlenmesini / çalışma zamanı hatalarını önlemek için etkin düğümü kullanabilirsiniz. Düğüm programında [kaynak] / işlemde [çalışan düğüm programı] bir değişiklik olduğunda, sıcak düğüm sizin için otomatik olarak nodejs uygulamasını yeniden başlatır.

Genel seçeneği kullanarak npm kullanarak sıcak düğümü yükleyin:

npm install -g hotnode


pm2 daha iyi bir seçimdir. daha sağlam, daha fazla seçenek. ve sonsuza kadar sahip olduğu kök olarak çalışırken sorun yaşamazsınız.
Lucas

@Lucas Bahsettiğiniz sonsuza dek bu kök problem nedir? Ne yazık ki iş yerinde bir üründe (bazı lisans bok nedeniyle) pm2 yerine sonsuza kadar kullanmak zorundayım ve bu beni çok endişelendiriyor!
GPX

4

Formdaki tüm cevaplara gereken saygıyla, bir nokta eklemek istiyorum.

Ctrl + Z kullanarak bir düğüm uygulamasını sonlandırdığımda, bir dahaki sefere açmaya çalıştığımda aynı hatayı EADDRINUSE aldığını buldum.

Bir düğüm uygulamasını sonlandırmak için Ctrl + C'yi kullandığımda, bir sonraki açışımda bir aksama yapmadan yaptı.

Bağlantı noktası numarasını hatalı olandan başka bir şeyle değiştirmek sorunu çözdü.


1
Ctrl + C doğrudur. Öncekiyle aynı port numarasını kullandım ve eskisi gibi çalıştı.
vipulnj

2
<key> Ctrl-Z </key> işlemi durdurmaz. Diğer komutları çalıştırabilmeniz için arkaplana koyar. Bu bir Unix kabuğu şey. İşleme devam etmek fgiçin aynı konsolda kullanın . Daha sonra, komut satırına çeşitli komutlar yazdıktan sonra o sunucuda neler olduğunu görebilirsiniz.
Alexis Wilke

4

Linux üzerinde.

İşlev ekle ~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

Çekme değişiklikleri: source ~/.bashrc

Ve kullanın: killTcpListen 3000


4

Cevabımda @Gerard'ın yorumu yeniden yazılıyor:

UNIX benzeri işletim sistemlerinde pkill nodejsveya pkill nodevarsa deneyin .

Bu, herhangi bir bağlantı noktasında çalışan düğüm sunucusunu çalıştıran işlemi öldürür. Benim için çalıştı.

Namaste🙏


3

Bu satırı yanlışlıkla birden çok kez ekleyip eklemediğinizi kontrol edin

app.listen(3000, function() {
  console.log('listening on 3000')
});

Yukarıdaki kod ekspres içindir, ancak kodunuzda aynı bağlantı noktasını iki kez kullanmaya çalışıp çalışmadığınızı kontrol edin.


3

Win10, git bash v2.15, düğüm v8.9.1, npm v5.5.1

Düğümü başlatmak için bir package.json komut dosyası vardı: "start": "node index.js"

Bunu her kullandığımda, ctrl + c ile öldürsem de, bu sorunla karşılaştım.

node index.jsGit yerine bash yerine koşup npm run startctrl + c ile öldürdüysem, bu hatayı hiç almadım.

Neden olduğundan emin değilim, ama bunun birisine yardımcı olabileceğini düşündüm.


1
Ben aynı sorunu aslında aynı kurulum ile alıyorum. Benim durumumda npm yoluyla hızlı bir uygulama çalıştırmanın iki işlemi ortaya çıkardığını fark ettim, ancak ctrl + c kullanırken sadece bir tanesi kapalı. uygulamayı yalnızca düğüm ile başlatırken, yalnızca bir işlem açıktır ve doğru şekilde kapanır.
worc

1
Windows için bu git sorunu her şeye ışık tutuyor. nane ve cygwin bağımlılığı arasında bir yerde bir hata olabilir gibi görünüyor.
worc

3

UI çözümü Windows kullanıcıları için: En iyi yanıtların benim için çalışmadığını gördüm, Mac veya Linux kullanıcıları için komutlar gibi görünüyorlardı. Hatırlamak için herhangi bir komut gerektirmeyen basit bir çözüm buldum: Görev Yöneticisi'ni açın (ctrl + shift + esc). Çalışan arka plan işlemlerine bakın. Node.js'yi bulun ve görevi sonlandırın.

Bunu yaptıktan sonra sorun benim için gitti. Diğer yanıtlarda belirtildiği gibi, daha önce bir hatayla karşılaşıldığı ve düzenli çıkış / temizleme işlevleri çağrılmadığı için hala çalışan arka plan süreçleri, bu yüzden onları öldürmenin bir yolu, Görev Yöneticisi'nde işlemi bulmak ve orada öldürmektir. . İşlemi bir terminal / powerShell'den çalıştırdıysanız, genellikle öldürmek için ctrl + c tuşlarını kullanabilirsiniz.


Evet, doğru cevap
verdiğiniz

2

Düğüm bellekte bir yerde çalışıyor ve bu bağlantı noktası kilitli. Windows'ta, bu sorun, çoğu Windows sorunu gibi CTRL+ ALT+ DELve / veya yeniden başlatılarak çözülecektir .


Bu soru başka pek çok soruyu cevaplıyor. Kapatın ve tekrar açın. Cin.
datUser

1

Bu sorunların nedenleri:

  1. Bu bağlantı noktasında Skype gibi herhangi bir uygulama çalışıyor olabilir.
  2. Düğüm çökmüş olabilir ve bağlantı noktası serbest bırakılmamış olabilir.
  3. Sunucuyu birden fazla başlatmayı denemiş olabilirsiniz. Bu sorunu çözmek için, sunucunun başlatılıp başlatılmadığını kontrol etmek için bir boole korunabilir. Yalnızca boole dönüşü false veya undefined olursa başlatılmalıdır;

1

server.close (), bağlantıyı kapatmak için biraz zaman alır, bu nedenle bunu asenkron bir çağrı yapmalıyız:

await server.close();

ÖNEMLİ: await kullanırken, kapsülleme işlevimizde async anahtar sözcüğünü şu şekilde kullanmalıyız :

async () => {
  await server.close();
}

1

Bağlantı noktasını değiştirmek için terminal / cmd'de aşağıdaki komutu kullanın (npm run dev node.js içindir) Uygulamanızı çalıştırmak için başka komutlarınız olabilir, bunların çoğu bağlantı noktasını değiştirirken daha kolay ve daha hızlı çalışacaktır. Ayrıca, 3002 yerine sisteminizde boş olan herhangi bir bağlantı noktası numarasını kullanabilirsiniz

PORT=3002 npm run dev

Çoğu zaman bir projeyi aniden veya bilmeden çıkarken, bağlantı noktasından çıkmanızı sağlayan control + z tuşlarına bastığınızda, sunucuyu veya projeyi çalıştırmak için bağlantı noktasından çıkamayan control + c'yi kullanın.

Ayrıca, kodunuzdaki bağlantı noktası numarasını değiştirme zamanı

server.listen(3002);

0

Bu, aynı bağlantı noktasında çalışan iki düğüm sunucunuz olduğu anlamına gelir, biri bağlantı noktasında çalışıyorsa, 3000'i diğerini başka bir bağlantı noktasına değiştirin, 3001 diyelim ve her şey iyi çalışır

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.