Hentikan program node.js dari baris perintah

304

Saya memiliki server TCP sederhana yang mendengarkan port.

var net = require("net");

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

server.listen(7777);

Saya memulainya dengan node server.jsdan kemudian menutupnya dengan Ctrl + Z pada Mac. Ketika saya mencoba menjalankannya lagi dengan node server.jssaya mendapatkan pesan kesalahan ini:

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)

Apakah saya menutup program dengan cara yang salah? Bagaimana saya bisa mencegah hal ini terjadi?

Eleeis
sumber
2
Mungkin perlu menambahkan bahwa Ctrl-Z menunda perintah di * NIX, dan tidak menutupnya. Jika Anda mengetik fgsetelah Ctrl-Z, Anda akan kembali ke tempat sebelumnya. Jadi simpul Anda sebelumnya masih berjalan. Hati-hati jika Anda melakukan ini untuk perintah lain juga!
ruffin
1
@ruffin ini harus menjadi jawaban. Jika Anda telah melakukan Ctrl+Ztindakan, metodologi yang tepat bisa fguntuk menghidupkan kembali proses, dan kemudian Ctrl+Cmembunuhnya dengan tepat.
Metagrapher

Jawaban:

393

Untuk mengakhiri program, Anda harus menggunakan Ctrl+ C. Jika Anda melakukannya, ia mengirim SIGINT, yang memungkinkan program untuk berakhir dengan anggun, tidak mengikat dari port mana pun ia mendengarkan.

Lihat juga: https://superuser.com/a/262948/48624

Brad
sumber
21
Ctrl + Ctidak bekerja untuk saya. Hanya ^Cdiketik di konsol, dan program tidak keluar.
Eleeist
1
@ Eleeist, Apa yang Anda gunakan sebagai terminal? Ini sangat bagus untuk saya.
Brad
2
@Eleeist, Anda mungkin telah memetakan kembali kunci Anda atau sesuatu. Ctrl+Cbekerja dengan baik. Bagaimanapun, itu masalah terpisah dari masalah Anda yang sebenarnya. Anda harus memposting pertanyaan "Ctrl + C tidak berfungsi" di SuperUser.com.
Brad
1
@ jt0dd Anda selalu bisa kill -9, tapi saya tidak mau. Apakah Anda benar-benar yakin aplikasi Anda masih tetap menjaga port terbuka? Saya tidak pernah memiliki masalah itu. Segera setelah aplikasi saya berakhir, koneksi selalu segera diakhiri. Saya akan menggunakan netstat untuk menentukan apakah aplikasi Anda atau sesuatu yang lain ada di port itu.
Brad
1
Saya menghadapi masalah ini ketika saya menggunakan jenis keyboard pada bahasa lain. Pastikan bahasa input mac Anda adalah bahasa Inggris
Fa.Shapouri
325

Ctrl+ Zmenangguhkannya, yang artinya masih dapat berjalan.

Ctrl+ Cakan benar-benar membunuhnya.

Anda juga dapat membunuhnya secara manual seperti ini:

ps aux | grep node

Temukan ID proses (kedua dari kiri):

kill -9 PROCESS_ID

Ini juga bisa berfungsi

killall node
Jamund Ferguson
sumber
ctrl + c akan bekerja tetapi tidak satu pun dari perintah ini akan bekerja untuk saya. Saya tidak tahu kenapa? Dan saya mencari solusi command line
marah kiwi
7
Hati-hati dengan killall node, Anda mungkin membunuh proses yang tidak ingin Anda bunuh jika mereka cocok dengan "node"
Samuel Bolduc
1
Anda mungkin ingin naik killall nodeke jawaban karena itu benar-benar pilihan termudah dan paling dapat diandalkan (selama Anda baik-baik saja dengan membunuh semua instance)
Boern
4
'killall' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan, atau file batch. Apakah saya melewatkan sesuatu?
Ayyash
Sama di sini ... Tidak ada jawaban? Dikatakan 'killall' tidak dikenali. Tidak satu pun dari perintah lain yang berfungsi baik. Apakah saya perlu me-restart komputer saya atau apa?
Metodis
37

Atau sebagai alternatif Anda dapat melakukan semua ini dalam satu baris:

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

Anda dapat mengganti simpul di dalam '\ snode \ s' dengan nama proses lainnya.

Hamid Tavakoli
sumber
2
secara bergantian, Anda selalu dapat mencoba: ps -ef | grep "simpul" | awk '{print $ 2}' | xargs kill -9
frymaster
Tampaknya berfungsi tetapi tidak mengembalikan saya ke prompt dengan benar. Pikiran?
Pengacara Setan
25

Lanjutkan dan bunuh proses:

Ctrl+ Zmenangguhkannya, yang berarti masih berjalan sebagai proses latar belakang yang ditangguhkan.

Anda sekarang berada di terminal prompt ...

  1. Berikan perintah fguntuk melanjutkan proses di latar depan.

  2. ketik Ctrl+ Cuntuk membunuhnya dengan benar.


Atau, Anda dapat membunuhnya secara manual seperti ini:

( CATATAN: perintah berikut mungkin memerlukan root, begitu sudo ...juga teman Anda)

pkill -9 node

atau, jika Anda tidak memiliki pkill, ini mungkin berhasil:

killall node

atau mungkin ini:

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

terkadang proses akan mencantumkan grepnya sendiri, dalam hal ini Anda akan membutuhkan:

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

.


h / t @ruffin dari komentar pada pertanyaan itu sendiri. Saya memiliki masalah yang sama dan komentarnya membantu saya menyelesaikannya sendiri.

Metagrapher
sumber
22

Anda dapat mengetik .exit untuk keluar dari simpul js REPL

sunny1304
sumber
2
Itu mengasumsikan bahwa Anda berada di REPL untuk memulai. Bagaimana jika saya menjalankan skrip Node?
IgorGanapolsky
18

Jika Anda menjalankan Node.js secara interaktif (REPL):

Ctrl+ Cakan membawa Anda kembali ke> prompt lalu ketik:

process.exit()

atau cukup gunakan Ctrl+ D.

sr77in
sumber
17

$ sudo killall nodedi terminal lain berfungsi di mac , sementara killall nodetidak berfungsi:

$ killall node
No matching processes belonging to you were found
Maxim Yefremov
sumber
13

di linux coba: pkill node

di windows:

Taskkill /IM node.exe /F

atau

from subprocess import call

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

Meskipun ini adalah jawaban yang terlambat, saya menemukan ini dari NodeJS docs :

Peristiwa 'keluar' dipancarkan ketika REPL keluar baik dengan menerima .exitperintah sebagai input, pengguna menekan <ctrl>-Cdua kali untuk memberi sinyal SIGINT, atau dengan menekan <ctrl>-Duntuk memberi sinyal 'akhir' pada aliran input. Callback pendengar dipanggil tanpa argumen.

Jadi untuk meringkas Anda dapat keluar dengan:

  1. Mengetik .exitdalam nodejs REPL.
  2. Menekan <ctrl>-Cdua kali.
  3. menekan <ctrl>-D.
  4. process.exit(0)artinya keluar secara alami dari REPL. Jika Anda ingin mengembalikan status lain, Anda dapat mengembalikan angka yang tidak nol.
  5. process.kill(process.pid) adalah cara untuk membunuh menggunakan simpuljs api dari dalam kode Anda atau dari REPL.
randominstanceOfLivingThing
sumber
5

Saya menambahkan jawaban ini karena untuk banyak proyek dengan penyebaran produksi, kami memiliki skrip yang menghentikan proses ini sehingga kami tidak perlu melakukannya.

Cara bersih untuk mengelola proses Node Server Anda menggunakan foreverpaket (dari NPM).

Contoh:

Instal Selamanya

npm install forever -g

Jalankan Node Server

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

Hasil:

info: Forever processing file: server.js

Shutdown Node Server

forever stop server.js

Hasil

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

Ini akan mematikan aplikasi Server Anda.

Diterjemahkan
sumber
3

Jika Anda ingin menghentikan server Anda dengan npm stopatau sesuatu seperti ini. Anda dapat menulis kode yang membunuh proses server Anda sebagai:

require('child_process').exec(`kill -9 ${pid}`)

Periksa tautan ini untuk detailnya: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

BigEgg
sumber
2

Saya mengalami masalah di mana saya memiliki beberapa server node berjalan, dan saya ingin membunuh salah satunya dan memindahkannya dari skrip.

Catatan: Contoh ini dalam bash shell di Mac.

Untuk itu saya memastikan untuk membuat nodepanggilan saya sespesifik mungkin. Misalnya daripada menelepon node server.jsdari direktori aplikasi, saya meneleponnode app_name_1/app/server.js

Maka saya bisa membunuhnya menggunakan:

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

Ini hanya akan mematikan proses simpul yang menjalankan app_name_1 / app / server.js.

Jika Anda menjalankan node app_name_2/app/server.jsproses simpul ini akan terus berjalan.

Jika Anda memutuskan ingin membunuh mereka semua dapat Anda gunakan killall nodeseperti yang disebutkan orang lain.

bapin93
sumber
2

Jawaban terlambat tetapi di windows, membuka task manager dengan CTRL + ALT + DEL kemudian membunuh proses Node.js akan menyelesaikan kesalahan ini.

Robert Molina
sumber
2

Anda dapat bekerja dengan mengikuti perintah untuk lebih spesifik dalam localerver kill (di sini: 8000)

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

$:lsof -i tcp:8000

Ini akan memberi Anda grup TCP berikut:

PERINTAH PID PENGGUNA UKURAN PERANGKAT FD TYPE / OFF NAMA NODE

simpul 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (DENGARKAN)

$:kill -9 21521

Ini akan mematikan processId yang sesuai dengan TCP *: 8000

Ank_247shbm
sumber
2

Untuk MacOS

  1. Terminal terbuka
  2. Jalankan kode di bawah ini dan tekan enter

     sudo kill $(sudo lsof -t -i:4200)
Siddhant Senapati
sumber
2

Anda bisa menggunakan fuser untuk mendapatkan apa yang ingin Anda lakukan.

Untuk mendapatkan id proses dari tugas yang berjalan pada port Anda dapat melakukan:

fuser <<target_port>>/tcp

Katakanlah portnya adalah 8888, perintahnya menjadi:

fuser 8888/tcp

Dan untuk mematikan proses yang berjalan pada port, cukup tambahkan -k switch.

fuser <<target_port>>/tcp -k

Contoh (port adalah 8888):

fuser 8888/tcp -k

Itu dia! Ini akan menutup proses mendengarkan pada port. Saya biasanya melakukan ini sebelum menjalankan aplikasi server saya.

Vikram Bankar
sumber
1

Kasus penggunaan saya: pada MacOS , jalankan / jalankan kembali beberapa node server pada port yang berbeda dari sebuah skrip

jalankan :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

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

stop2, stop3 ...

jalankan kembali :"stop1 & stop2 & ... & stopN ; run

untuk info lebih lanjut tentang menemukan proses oleh port: Siapa yang mendengarkan pada port TCP yang diberikan pada Mac OS X?

Edan Chetrit
sumber
0

Untuk windows pertama-tama cari PID dengan nomor port Anda

netstat -ano | findStr "portNumber"

Setelah itu, bunuh tugas, pastikan Anda berada di root drive "c" Anda masukkan deskripsi gambar di sini Dan perintahnya akantaskkill /F /PID your pid

gem007bd
sumber
0

jika Anda menggunakan VS Code dan terminal pilih node dari dropdown sisi kanan terlebih dahulu dan kemudian lakukan Ctrl + C. Kemudian itu akan bekerja

masukkan deskripsi gambar di sini

Tekan y saat Anda diminta.

masukkan deskripsi gambar di sini

Terima kasih

MindRoasterMir
sumber