Cara keluar di Node.js

1868

Apa perintah yang digunakan untuk keluar? (Yaitu menghentikan proses Node.js)

Bryan Field
sumber

Jawaban:

2376

Panggil metode processobjek global exit:

process.exit()

Dari dokumen:

process.exit ([kode])

Mengakhiri proses dengan yang ditentukan code. Jika dihilangkan, keluar menggunakan kode 'sukses' 0.

Untuk keluar dengan kode 'gagal':

process.exit(1);

Shell yang mengeksekusi node harus melihat kode keluar sebagai 1.

Pero P.
sumber
5
Hanya ingin menambahkan sesuatu. Jika Anda menangani permintaan, Anda juga harus end()meminta. Kalau tidak, itu hanya akan menggantung.
pixelfreak
126
@pixelfreak, exittidak menyesatkan sama sekali. Anda bingung tentang cara kerja Node. Pikirkan Node sebagai server itu sendiri. Itu tidak hanya dinyalakan sesuai kebutuhan, seperti PHP di dalam server web seperti Apache. Node bahkan tidak harus ada hubungannya dengan server web sama sekali! Ini hanya sebuah host untuk beberapa JavaScript, dengan beberapa perpustakaan bawaan yang bagus untuk melakukan hal-hal yang berguna.
Brad
6
@Brad Dan PHP adalah bahasa tujuan umum. Tidak perlu menjalankannya dengan mod_phpatau menggunakan Apache. Anda dapat menerapkan kembali httpd di PHP seperti node jika Anda benar-benar ingin atau menggunakan pendekatan yang lebih waras / standar seperti FastCGI seperti yang Anda bisa dalam node.
binki
38
Harap dicatat bahwa process.exit()ini tidak dianjurkan , seperti yang dijelaskan dalam jawaban di bawah ini .
AndreasPizsa
410

Hanya catatan bahwa menggunakan process.exit([number])adalah tidak direkomendasikan praktek.

Panggilan process.exit()akan memaksa proses untuk keluar secepat mungkin bahkan jika masih ada operasi asinkron yang belum selesai sepenuhnya, termasuk operasi I / O ke process.stdoutdan process.stderr.

Dalam sebagian besar situasi, sebenarnya tidak perlu menelepon process.exit()secara eksplisit. Proses Node.js akan keluar sendiri jika tidak ada pekerjaan tambahan yang tertunda di loop acara. The process.exitCodeproperti dapat diatur untuk memberitahu proses yang kode keluar untuk digunakan saat proses keluar anggun.

Misalnya, contoh berikut menggambarkan penyalahgunaan dari process.exit()metode yang dapat menyebabkan data yang dicetak untuk stdoutyang dipotong dan kehilangan:

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

Alasan ini bermasalah adalah karena menulis process.stdoutdi Node.js kadang-kadang tidak sinkron dan dapat terjadi lebih dari beberapa kutu dari loop peristiwa Node.js. Memanggil process.exit(), bagaimanapun, memaksa proses untuk keluar sebelum penulisan tambahan itu stdoutdapat dilakukan.

Daripada menelepon process.exit()langsung, kode harus mengatur process.exitCodedan memungkinkan proses untuk keluar secara alami dengan menghindari penjadwalan pekerjaan tambahan untuk loop acara:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}
Dominic
sumber
31
Ini adalah jawaban terbaik, sejauh ini. Jawaban lain mungkin tidak memungkinkan simpul untuk memproses acara yang tertunda dengan benar sebelum keluar, sangat menyedihkan :(
djabraham
3
Setuju, ini seharusnya memiliki lebih banyak upvotes! Saya memiliki skrip simpul yang memulai beberapa proses anak melalui shelljs.exec dan saya ingin keseluruhan skrip saya kembali dengan kode keluar kesalahan jika salah satu proses anak gagal. process.exitCode = 1 bekerja sangat baik di callback exec (sedangkan memanggil proses.exit (1) di sana akan keluar dari skrip utama sebelum semua proses anak selesai!)
Nick
15
Saya menggunakan jawaban ini dan menemukan bahwa proses saya tidak pernah benar-benar keluar. Harus ctrl-C itu.
jcollum
34
Ada banyak kasus penggunaan untuk proses segera dan penghentian acara yang tertunda. Itulah tepatnya yang process.exit()dimaksudkan untuk.
Dominic Cerisano
7
Ini bukan jawaban terbaik dengan cara apa pun karena tidak menjawab pertanyaan. Sebaliknya, ini memberikan praktik terbaik tentang cara mengembangkan aliran kode untuk program nodejs.
anon58192932
365

Dari dokumentasi resmi nodejs.org :

process.exit(code)

Mengakhiri proses dengan kode yang ditentukan. Jika dihilangkan, keluar menggunakan kode 'sukses' 0.

Untuk keluar dengan kode 'gagal':

process.exit(1);
alienhard
sumber
9
@Alison ya, atau lebih tepatnyacode = 0; process.exit(code);
wprl
7
Benarkah jika Anda keluar, Anda mungkin tidak peduli dengan nilainya code?
Armand
8
@Alison Ide yang lebih baik adalah process.exit()tanpa parameter sebagai kode default ke 0
Jeremy Moritz
2
@Armand Anda benar - Kode hanya sebuah variabel, dan dalam hal ini digunakan untuk menunjukkan apa parameternya. Jadi .exit (0) melakukan semua yang dilakukan oleh contoh.
Gerard ONeill
23
@Armand kode bukan untuk Anda, itu untuk apa pun yang menjalankan kode Anda. Misalnya, jika Anda membuat exit_0.js dengan process.exit(0);dan menjalankannya node exit_0.js && echo 'success'akan mengatakan "berhasil". Jika Anda membuat exit_1.js dengan process.exit(1);dan menjalankannya node exit_1.js && echo 'success'tidak akan mengatakan "berhasil" karena proses Anda keluar dengan nol (yang menunjukkan "kegagalan" atau "keluar abnormal" ke shell). Selain itu, Anda akan melihat nilai yang berbeda $?jika Anda menjalankan node exit_1.jsvs node exit_0.js(Anda dapat memeriksa dengan melakukan node exit_1.jsdan kemudian melakukan echo $?).
msouth
277

Jika Anda berada di terminal Unix atau baris perintah Windows dan ingin keluar dari Node REPL, ...

  • Tekan Ctrl+ Cdua kali, atau
  • ketik .exitdan tekan Enter, atau
  • tekan Ctrl+ Ddi awal baris (Hanya Unix)
Mohsen
sumber
14
Perhatikan bahwa, di luar Node, pintasan Ctrl + D di Mac atau Linux berfungsi di hampir semua shell dan REPL yang pernah Anda temui, termasuk shell Unix seperti Bash, shell untuk database seperti MySQL dan PostgreSQL, dan REPL untuk bahasa pemrograman seperti Python, PHP, dan Ruby. Ini adalah satu-satunya metode untuk keluar dari kerang yang pernah saya gunakan.
Mark Amery
2
Untuk nodeREPL, Ctrl + D untuk keluar adalah perilaku standar, jadi ini juga berfungsi pada Windows.
Alan
Tekan Ctrl + C (bahkan pada Mac!)
Prince
124

Dari baris perintah, .exititulah yang Anda inginkan:

$ node
> .exit
$

Ini didokumentasikan dalam dokumen REPL . REPL (Read-Eval-Print-Loop) adalah apa yang disebut baris perintah Node.

Dari program normal, gunakan process.exit([code]).

Mike M. Lin
sumber
79

Itu tergantung pada alasan mengapa Anda bersedia untuk keluar dari proses node.js, tetapi dalam hal apa pun process.exit()adalah opsi terakhir untuk dipertimbangkan . Kutipan dari dokumentasi:

Penting untuk dicatat bahwa panggilan process.exit()akan memaksa proses untuk keluar secepat mungkin bahkan jika masih ada operasi asinkron yang tertunda yang belum selesai sepenuhnya, termasuk operasi I / O ke process.stdoutdan process.stderr.

Dalam sebagian besar situasi, sebenarnya tidak perlu menelepon process.exit()secara eksplisit. Proses Node.js akan keluar sendiri jika tidak ada pekerjaan tambahan yang tertunda di loop acara. The process.exitCodeproperti dapat diatur untuk memberitahu proses yang kode keluar untuk digunakan saat proses keluar anggun.

Mari kita bahas kemungkinan alasan mengapa Anda mungkin ingin keluar dari proses node.js dan mengapa Anda harus menghindari process.exit():

Kasus 1 - Eksekusi selesai (skrip baris perintah)

Jika skrip telah mencapai akhirnya dan penerjemah simpul tidak keluar, ini menunjukkan bahwa beberapa operasi async masih tertunda. Adalah salah untuk memaksakan penghentian proses process.exit()pada saat ini. Lebih baik untuk mencoba memahami apa yang menghalangi skrip Anda keluar dengan cara yang diharapkan . Dan ketika Anda menyelesaikan ini, Anda dapat menggunakan process.exitCodeuntuk mengembalikan hasil apa pun ke proses panggilan.

Kasus 2 - Pengakhiran karena sinyal eksternal (SIGINT / SIGTERM / lainnya)

Misalnya, jika Anda bersedia menutup aplikasi ekspres dengan anggun . Tidak seperti skrip baris perintah, aplikasi ekspres terus berjalan tanpa batas, menunggu permintaan baru. process.exit()akan menjadi opsi yang buruk di sini karena itu akan mengganggu semua permintaan yang ada di dalam pipa. Dan beberapa dari mereka mungkin non-idempoten (UPDATE, DELETE). Klien tidak akan pernah tahu apakah permintaan itu selesai atau tidak di sisi server dan itu mungkin menjadi alasan inkonsistensi data antara klien dan server. Satu-satunya solusi yang baik adalah memberi tahu server http untuk berhenti menerima permintaan baru dan menunggu yang menunggu selesai dengan server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Jika masih tidak keluar - lihat Kasus 1.

Kasus 3 - Kesalahan internal

Selalu lebih baik untuk throwkesalahan, Anda akan mendapatkan jejak stack dan pesan kesalahan yang diformat dengan baik. Kode tingkat atas selalu dapat memutuskan apakah mereka dapat menangani kesalahan ( catch) atau membiarkannya menghentikan proses. Di sisi lain, process.exit(1)akan menghentikan proses secara diam-diam dan tidak akan ada kesempatan untuk pulih dari ini. Ini mungkin satu-satunya "manfaat" dari process.exit(), Anda dapat yakin bahwa proses akan dihentikan.

teq
sumber
4
Respon luar biasa. Process.exit()Sepertinya berlebihan untuk sebagian besar aplikasi. Saya sedang mencari yang setara dengan fungsi die () php ... lebih seperti:throw new Error('die msg')
AvadData
Jika seseorang memiliki banyak kode yang seharusnya dieksekusi terus menerus hingga permintaan shutdown diterima, apakah ada konvensi yang bagus untuk mendaftarkan acara yang akan memungkinkan langganan ditinggalkan sebagai tanggapan terhadap permintaan shutdown, tanpa memerlukan kode menggunakan event tersebut atau kode yang meminta shutdown memiliki pengetahuan khusus tentang satu sama lain? Sayangnya, satu-satunya cara yang saya bisa pikirkan untuk menerapkan agak-agak yang mengharuskan setiap bagian dari kode yang mendaftar acara juga membuat pembungkus yang mencakup penutupan untuk membatalkan registrasi itu.
supercat
26

REPL (Baris Perintah)

  • Tekan ctrl + c dua kali

  • Ketik .exitdan tekan enter

File Skrip

process.exit(code)

Node biasanya keluar dengan kode 0 saat tidak ada lagi operasi async yang tertunda.

process.exit(1) harus digunakan untuk keluar dengan kode kegagalan. Ini akan memungkinkan kita untuk menyimpulkan bahwa simpul tidak menutup dengan anggun dan terpaksa menutup.

Ada kode keluar lain seperti

3 - Kesalahan Parse JavaScript Internal (sangat jarang)

5 - Kesalahan fatal pada mesin javascript v8

9 - Argumen tidak valid

Untuk daftar lengkap, lihat kode keluar simpul

Siva Prakash
sumber
12

Saya memiliki aplikasi yang ingin saya:

  1. Kirim email ke pengguna
  2. Keluar dengan kode kesalahan

Saya harus mengait process.exit(code)ke exitevent handler, atau surat tidak akan dikirim karena menelepon process.exit(code)langsung membunuh acara yang tidak sinkron.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });
Stephen Quan
sumber
4
Saya pikir Anda ingin process.exitCode
Julian de Bhal
Sebagai catatan: Saya menghabiskan sebagian besar hari berusaha process.exitCodeuntuk bekerja untuk saya dalam alat baris perintah yang saya bangun (diuji pada Node v4.3.0). Tapi saya tidak bisa bersikap seperti yang didokumentasikan. Ini sangat baik bisa menjadi kasus tepi dengan commander- meskipun github.com/tj/commander.js/… membuat saya bertanya-tanya. Tidak yakin apakah ada orang lain di luar sana yang melihat masalah ini dengan Node 4, tetapi mendokumentasikannya untuk referensi mendatang.
mikermcneil
kembali kemungkinan ini datang dari komandan, saya juga melihat satu-satunya dep ( github.com/zhiyelee/graceful-readlink/… ) tetapi tidak ada dadu. Hanya pelakunya yang mungkin tampak seperti: github.com/tj/commander.js/blob/... Secara khusus, masalahnya adalah bahwa, bahkan jika Anda menetapkan process.exitCode = 1, proses keluar dengan kode 0.
mikermcneil
11

Seperti yang ditunjukkan @Dominic, melempar kesalahan yang tidak tertangkap adalah praktik yang lebih baik daripada memanggil process.exit ([kode]) :
process.exitCode = 1; throw new Error("my module xx condition failed");

BANYAK
sumber
3
Diambil dalam konteks pertanyaan "Bagaimana cara keluar di Node.js", ini adalah saran yang mengerikan. Saran Anda akan jauh lebih masuk akal jika pertanyaannya secara spesifik menanyakan bagaimana cara keluar dari kesalahan. Saya sangat menyarankan agar Anda mengucapkan respons Anda sedemikian rupa untuk menunjukkan bahwa pengguna melakukan apa yang Anda sarankan, hanya jika mereka mencoba keluar dari aplikasi jika terjadi kesalahan .
rstackhouse
@rstackhouse, saya harap Anda telah melalui melemparkan kesalahan yang tidak tertangkap yang mengarah ke -> nodejs.org/api/process.html#process_process_exit_code
MANN
5
Masalah dengan melempar adalah jejak tumpukan jelek. Adakah tip untuk menghindari jejak tumpukan ini (tidak relevan ketika alat CLI ingin keluar jika penggunaannya tidak benar)?
MoOx
9

Untuk keluar

let exitCode = 1;
process.exit(exitCode)

Kode keluar yang berguna

1 - Catchall untuk kesalahan umum
2 - Penyalahgunaan bawaan shell (menurut dokumentasi Bash)
126 - Perintah yang dipanggil tidak bisa dijalankan
127 - "perintah tidak ditemukan"
128 - Argumen tidak valid untuk keluar
128 + n - Sinyal kesalahan fatal "n"
130 - Script diakhiri oleh Control-C
255 \ * - Keluar dari status di luar jangkauan
Denis Lisitskiy
sumber
Pertimbangkan untuk memperbarui jawaban Anda, nodejs.org/api/process.html#process_process_exit_code
Cmag
7

Dari kode yang dapat Anda gunakan di process.exit([errorcode])mana [errorcode]bilangan bulat opsional ( 0adalah standar untuk menunjukkan keberhasilan).

Jika Anda menggunakan Read Eval Print Loop (REPL) , Anda dapat menggunakan Ctrl+ D, atau mengetik.exit

Atau, pada Windows atau Linux Anda dapat menggunakan Ctrl+ C, Ctrl+C

Pada Mac perintahnya adalah Ctrl+ Z, Ctrl+Z

zzzzBov
sumber
2
Dua kontrol c bekerja pada mac, juga, setidaknya pada milikku dengan node --version v0.10.18
msouth
Control-C tampaknya tidak membatalkan operasi yang sudah dijadwalkan, sedangkan ctrl-z membunuh proses tanpa penundaan, di Mac.
jorisw
7

Tekan Ctrl + Cdua kali atau .exit.

> 
(To exit, press ^C again or type .exit)
> 
HeadAndTail
sumber
3

Saya bisa mendapatkan semua proses simpul saya untuk mati langsung dari Git Bash shell pada Windows 10 dengan mengetik taskkill -F -IM node.exe- ini mengakhiri semua proses simpul di komputer saya sekaligus. Saya menemukan saya juga bisa menggunakan taskkill //F //IM node.exe. Tidak yakin mengapa baik -dan //bekerja dalam konteks ini. Semoga ini membantu!

Alison Stuart
sumber
Itu karena taskkill itu sendiri. Anda membunuh proses itu sendiri. Juga, satu / cukup.
Paul Stelian
2

Karena proses adalah objek global, Anda tidak perlu mengimpor modul apa pun. Fungsi berikut keluar atau membunuh proses simpul saat ini.

process.exit (kode)

process.kill (process.pid)

process.abort ()

sumit_suthar
sumber
1

Buka terminal baris perintah tempat aplikasi simpul berjalan dan tekan Ctrl + C

jika Anda ingin keluar dari aplikasi simpul js dari kode,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 
Shekar Mania
sumber
0

jika Anda ingin keluar dari aplikasi node js kemudian tulis

process.exit(1)

dalam kode Anda

Ajay Mudaliyar
sumber
3
1 digunakan untuk menunjukkan ada kesalahan dalam aplikasi, yang jawaban lainnya sudah menjelaskan.
Herick
0

Keluar di simpul js dilakukan dengan dua cara:

  • Memanggil process.exit () secara eksplisit.
  • Atau, jika simpul acara nodejs dilakukan dengan semua tugas, dan tidak ada yang tersisa untuk dilakukan. Kemudian, aplikasi simpul akan keluar secara otomatis.

Bagaimana itu bekerja?

Jika Anda ingin memaksa loop eksekusi untuk menghentikan proses, Anda dapat menggunakan proses variabel global yang merupakan turunan dari EventEmitter . Jadi ketika Anda memanggil process.exit () Anda benar-benar memancarkan event keluar yang mengakhiri semua tugas dengan segera bahkan jika masih ada operasi asinkron yang belum dilakukan.

process.exit () mengambil kode keluar (Integer) sebagai parameter. Kode 0 adalah default dan ini berarti keluar dengan 'sukses'. Sedangkan kode 1 berarti keluar dengan 'gagal'.

Majid Jiji
sumber
0

Jika Anda berada di Windows, buka Task Manager, lalu buka Processes, cari proses yang disebut "node", lalu klik dengan tombol kanan mouse Anda dan kemudian klik opsi "End Process".

Albos Hajdari
sumber
-1

Anda dapat menggunakan fungsi process.exit ([code]) .

Jika Anda ingin keluar tanpa 'kegagalan', Anda menggunakan kode 0:

process.exit(0);

Untuk keluar dengan kode 'gagal' 1Anda dapat menjalankan:

process.exit(1);

Kode 'kegagalan' dari kegagalan khusus untuk aplikasi. Jadi, Anda dapat menggunakan konvensi Anda sendiri untuk itu.

Oleksii Trekhleb
sumber