Cách thoát trong Node.js


1868

Lệnh được sử dụng để thoát là gì? (tức là chấm dứt quá trình Node.js)

Câu trả lời:


2376

Gọi phương thức processcủa đối tượng toàn cầu exit:

process.exit()

Từ các tài liệu:

process.exit ([code])

Kết thúc quá trình với chỉ định code. Nếu bị bỏ qua, thoát sử dụng mã 'thành công' 0.

Để thoát với mã 'thất bại':

process.exit(1);

Shell đã thực thi nút sẽ thấy mã thoát là 1.


5
Chỉ muốn thêm một cái gì đó. Nếu bạn đang xử lý một yêu cầu, bạn cũng nên end()yêu cầu. Nếu không, nó sẽ bị treo.
pixelfreak

126
@pixelfreak, hoàn toàn exitkhông gây hiểu lầm. Bạn đang bối rối về cách Node hoạt động. Hãy nghĩ về Node như chính máy chủ. Nó không chỉ được kích hoạt khi cần thiết, giống như PHP nằm trong một máy chủ web như Apache. Node thậm chí không phải làm gì với máy chủ web cả! Nó chỉ là một máy chủ lưu trữ cho một số JavaScript, với một số thư viện tích hợp tiện lợi để làm những việc hữu ích.
Brad

6
@Brad Và PHP là một ngôn ngữ có mục đích chung. Không cần phải chạy nó với mod_phphoặc sử dụng Apache. Bạn có thể thực hiện lại một httpd trong PHP giống như nút nếu bạn thực sự muốn hoặc sử dụng một cách tiếp cận chuẩn / lành mạnh hơn như FastCGI giống như bạn có thể trong nút.
binki 8/8/2016

38
Hãy lưu ý rằng process.exit()không được khuyến khích , như mô tả trong câu trả lời dưới đây .
AndreasPizsa

410

Chỉ cần một lưu ý rằng việc sử dụng process.exit([number])không khuyến cáo thực hành.

Việc gọi process.exit()sẽ buộc quá trình thoát ra càng nhanh càng tốt ngay cả khi vẫn còn các hoạt động không đồng bộ đang chờ xử lý mà chưa hoàn thành đầy đủ, bao gồm các hoạt động I / O đến process.stdoutprocess.stderr.

Trong hầu hết các tình huống, thực sự không cần thiết phải gọi process.exit()một cách rõ ràng. Quá trình Node.js sẽ tự thoát nếu không có công việc bổ sung nào đang chờ xử lý trong vòng lặp sự kiện. Các process.exitCodebất động sản có thể được thiết lập để nói lên quá trình mà exit code để sử dụng khi quá trình thoát một cách duyên dáng.

Ví dụ, ví dụ sau đây minh họa một lạm dụng của các process.exit()phương pháp đó có thể dẫn đến dữ liệu in để stdoutđược cắt ngắn và mất:

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

Lý do điều này có vấn đề là vì ghi process.stdoutvào Node.js đôi khi không đồng bộ và có thể xảy ra trên nhiều dấu vết của vòng lặp sự kiện Node.js. Gọi process.exit(), tuy nhiên, buộc quá trình phải thoát ra trước khi những lần ghi bổ sung đó stdoutcó thể được thực hiện.

Thay vì gọi process.exit()trực tiếp, mã nên đặt process.exitCodevà cho phép quá trình thoát tự nhiên bằng cách tránh lập lịch cho bất kỳ công việc bổ sung nào cho vòng lặp sự kiện:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}

31
Đây là câu trả lời tốt nhất, cho đến nay. Các câu trả lời khác có thể không cho phép nút xử lý đúng các sự kiện đang chờ xử lý trước khi thoát, rất buồn :(
djabraham

3
Đồng ý, điều này nên có nhiều upvote! Tôi đã có một tập lệnh nút khởi động nhiều tiến trình con thông qua shelljs.exec và tôi muốn tập lệnh tổng thể của mình trả về với mã thoát lỗi nếu bất kỳ tiến trình con nào thất bại. process.exitCode = 1 hoạt động rất tốt trong các cuộc gọi lại exec (trong khi chỉ cần gọi process.exit (1) trong đó sẽ thoát khỏi tập lệnh chính trước khi tất cả các tiến trình con kết thúc!)
Nick

15
Tôi đã sử dụng câu trả lời này và thấy rằng quá trình của tôi không bao giờ thực sự thoát ra. Phải ctrl-C nó.
jcollum

34
Có nhiều trường hợp sử dụng cho quá trình ngay lập tức và chờ kết thúc sự kiện. Đó là chính xác những gì process.exit()được dự định.
Đaminh Cerisano

7
Đây không phải là câu trả lời tốt nhất bởi bất kỳ câu hỏi nào vì nó không trả lời câu hỏi. Thay vào đó, nó cung cấp các thực tiễn tốt nhất về cách phát triển dòng mã cho chương trình nodejs.
anon58192932

365

Từ tài liệu chính thức của nodejs.org :

process.exit(code)

Kết thúc quá trình với mã được chỉ định. Nếu bị bỏ qua, thoát sử dụng mã 'thành công' 0.

Để thoát với mã 'thất bại':

process.exit(1);

9
@ Alison có, hoặc chính xác hơncode = 0; process.exit(code);
wprl

7
Có đúng là nếu bạn thoát ra, có lẽ bạn không quan tâm đến giá trị của code?
Armand

8
@ Alison Một ý tưởng tốt hơn là process.exit()không có tham số nào khi mã mặc định là 0
Jeremy Moritz

2
@Armand Bạn đã đúng - Mã chỉ là một biến và trong trường hợp này được sử dụng để chỉ ra tham số là gì. Vì vậy, .exit (0) làm mọi thứ mà ví dụ này làm.
Gerard ONeill

23
@Armand mã không dành cho bạn, nó dành cho bất cứ thứ gì chạy mã của bạn. Ví dụ: nếu bạn tạo một exit_0.js process.exit(0);và chạy nó với node exit_0.js && echo 'success'nó sẽ nói "thành công". Nếu bạn tạo exit_1.js bằng process.exit(1);và chạy, node exit_1.js && echo 'success'nó sẽ không nói "thành công" vì quy trình của bạn đã thoát với giá trị khác không (biểu thị "lỗi" hoặc "thoát bất thường" đối với hệ vỏ). Ngoài ra, bạn sẽ thấy các giá trị khác nhau $?nếu bạn chạy node exit_1.jsvs node exit_0.js(bạn có thể kiểm tra bằng cách thực hiện node exit_1.jsvà sau đó thực hiện echo $?).
msouth

277

Nếu bạn đang ở trong một thiết bị đầu cuối Unix hoặc dòng lệnh Windows và muốn thoát khỏi REPL của Node, thì ...

  • Nhấn Ctrl+ Chai lần hoặc
  • .exitvà nhấn Enter, hoặc
  • nhấn Ctrl+ Dở đầu một dòng (chỉ Unix)

14
Lưu ý rằng, ngoài Node, phím tắt Ctrl + D trên Mac hoặc Linux hoạt động trên hầu hết các shell và REPL mà bạn từng gặp, bao gồm các shell Unix như Bash, shell cho cơ sở dữ liệu như MySQL và PostgreQuery và REPL cho các ngôn ngữ lập trình như Python, PHP và Ruby. Nó là phương pháp duy nhất để thoát khỏi shell mà tôi từng sử dụng.
Đánh dấu Amery

2
Đối với nodeREPL, Ctrl + D để thoát là một hành vi tiêu chuẩn, do đó, nó cũng hoạt động trên Windows.
Alan

Nhấn Ctrl + C (ngay cả trên máy Mac!)
Hoàng tử

124

Từ dòng lệnh, .exitlà những gì bạn muốn:

$ node
> .exit
$

Nó được ghi lại trong các tài liệu REPL . REPL (Read-Eval-Print-Loop) là dòng lệnh Node được gọi.

Từ một chương trình bình thường, sử dụng process.exit([code]).


79

Nó phụ thuộc vào lý do tại sao bạn sẵn sàng thoát khỏi quá trình node.js, nhưng trong mọi trường hợp process.exit()tùy chọn cuối cùng để xem xét . Một trích dẫn từ tài liệu:

Điều quan trọng cần lưu ý là việc gọi process.exit()sẽ buộc quá trình thoát ra càng nhanh càng tốt ngay cả khi vẫn còn các hoạt động không đồng bộ đang chờ xử lý mà chưa hoàn thành đầy đủ, bao gồm các hoạt động I / O đến process.stdoutprocess.stderr.

Trong hầu hết các tình huống, thực sự không cần thiết phải gọi process.exit()một cách rõ ràng. Quá trình Node.js sẽ tự thoát nếu không có công việc bổ sung nào đang chờ xử lý trong vòng lặp sự kiện. Các process.exitCodebất động sản có thể được thiết lập để nói lên quá trình mà exit code để sử dụng khi quá trình thoát một cách duyên dáng.

Chúng ta hãy đề cập đến những lý do có thể khiến bạn sẵn sàng thoát khỏi quá trình node.js và tại sao bạn nên tránh process.exit():

Trường hợp 1 - Hoàn thành thực thi (tập lệnh dòng lệnh)

Nếu tập lệnh đã kết thúc và trình thông dịch nút không thoát, nó chỉ ra rằng một số hoạt động không đồng bộ vẫn đang chờ xử lý. process.exit()Tại thời điểm này, việc buộc chấm dứt quá trình là sai . Tốt hơn hết là cố gắng hiểu những gì đang giữ kịch bản của bạn thoát ra theo cách mong đợi . Và khi bạn giải quyết điều này, bạn có thể sử dụng process.exitCodeđể trả về bất kỳ kết quả nào cho quá trình gọi.

Trường hợp 2 - Chấm dứt vì tín hiệu bên ngoài (SIGINT / SIGTERM / khác)

Ví dụ: nếu bạn sẵn sàng tắt ứng dụng cấp tốc một cách duyên dáng . Không giống như tập lệnh dòng lệnh, ứng dụng express tiếp tục chạy vô tận, chờ đợi các yêu cầu mới.process.exit()sẽ là một lựa chọn tồi ở đây vì nó sẽ làm gián đoạn tất cả các yêu cầu đang được xử lý. Và một số trong số chúng có thể không phải là idempotent (CẬP NHẬT, XÓA). Khách hàng sẽ không bao giờ biết liệu những yêu cầu đó đã được hoàn thành hay chưa ở phía máy chủ và đó có thể là lý do của sự không thống nhất dữ liệu giữa máy khách và máy chủ. Giải pháp tốt duy nhất là yêu cầu máy chủ http ngừng chấp nhận các yêu cầu mới và chờ các yêu cầu đang chờ xử lý kết thúc với 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");
   });
});

Nếu nó vẫn không thoát - xem Trường hợp 1.

Trường hợp 3 - Lỗi nội bộ

throwLỗi luôn luôn tốt hơn , bạn sẽ nhận được thông báo lỗi và dấu vết ngăn xếp được định dạng độc đáo. Các mức mã cao hơn luôn có thể quyết định xem chúng có thể xử lý lỗi ( catch) hay để nó làm hỏng quá trình. Mặt khác, process.exit(1)sẽ chấm dứt quá trình âm thầm và sẽ không có cơ hội để phục hồi từ điều này. Nó có thể là lợi ích duy nhất của người Viking process.exit(), bạn có thể chắc chắn rằng quá trình đó sẽ bị chấm dứt.


4
Phản ứng tuyệt vời. Process.exit()có vẻ như quá mức cần thiết cho hầu hết các ứng dụng. Tôi đang tìm một hàm tương đương với hàm die () của php ... giống như:throw new Error('die msg')
AvadData

Nếu một người có một loạt mã được cho là thực thi liên tục cho đến khi nhận được yêu cầu tắt máy, thì có bất kỳ quy ước tốt đẹp nào để đăng ký các sự kiện cho phép đăng ký bị bỏ qua để đáp ứng yêu cầu tắt máy, mà không yêu cầu mã sử dụng các sự kiện hoặc mã yêu cầu tắt máy có kiến ​​thức cụ thể về nhau? Thật không may, cách duy nhất tôi có thể nghĩ đến để thực hiện sắp xếp đó là yêu cầu bất kỳ đoạn mã nào đăng ký một sự kiện cũng tạo ra một trình bao bọc bao gồm đóng để hủy đăng ký nó.
supercat

26

REPL (Dòng lệnh)

  • Nhấn ctrl + c hai lần

  • Nhập .exitvà nhấn enter

Tập kịch bản

process.exit(code)

Nút thường thoát với mã 0 khi không còn hoạt động async nào đang chờ xử lý.

process.exit(1) nên được sử dụng để thoát với mã lỗi. Điều này sẽ cho phép chúng ta suy ra rằng nút không đóng một cách duyên dáng và buộc phải đóng.

Có các mã thoát khác như

3 - Lỗi phân tích cú pháp JavaScript nội bộ (rất rất hiếm)

5 - Lỗi nghiêm trọng trong công cụ javascript v8

9 - Đối số không hợp lệ

Để biết danh sách đầy đủ, xem mã thoát nút


12

Tôi có một ứng dụng mà tôi muốn:

  1. Gửi email cho người dùng
  2. Thoát với mã lỗi

Tôi đã phải nối process.exit(code)với một bộ exitxử lý sự kiện, nếu không thư sẽ không được gửi vì gọi process.exit(code)trực tiếp sẽ giết các sự kiện không đồng bộ.

#!/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); });

4
Tôi nghĩ bạn muốn process.exitCode
Julian de Bhal

Đối với hồ sơ: Tôi đã dành một phần lớn thời gian trong ngày để cố gắng process.exitCodelàm việc cho tôi trong một công cụ dòng lệnh tôi đang xây dựng (đã thử nghiệm trên Node v4.3.0). Nhưng tôi không thể làm cho nó hoạt động như tài liệu. Điều này rất có thể đã là một trường hợp cạnh với commander- mặc dù github.com/tj/commander.js/, làm cho tôi tự hỏi. Không chắc chắn nếu có ai khác đã thấy vấn đề này với Nút 4, nhưng tài liệu chỉ trong trường hợp để tham khảo trong tương lai.
mikermcneil

Có khả năng điều này đến từ chỉ huy, tôi cũng đã xem xét dep của nó ( github.com/zhiyelee/graceful-readlink/ mẹo ) nhưng không có xúc xắc. Chỉ có thủ phạm có thể có vẻ như có thể: github.com/tj/commander.js/blob/ , Cụ thể, vấn đề là, ngay cả khi bạn đặt process.exitCode = 1, quá trình thoát với mã 0.
mikermcneil

11

Như @Dominic đã chỉ ra, ném một lỗi chưa được kiểm tra là cách tốt hơn thay vì gọi process.exit ([code]) :
process.exitCode = 1; throw new Error("my module xx condition failed");


3
Được đặt trong bối cảnh của câu hỏi "Cách thoát trong Node.js", đây là lời khuyên khủng khiếp. Đề xuất của bạn sẽ có ý nghĩa hơn nhiều nếu câu hỏi được hỏi cụ thể làm thế nào để thoát khỏi lỗi. Tôi thực sự khuyên bạn nên trả lời câu trả lời của mình theo cách để cho biết rằng người dùng làm như bạn đề xuất, chỉ khi họ đang cố thoát khỏi ứng dụng trong trường hợp xảy ra lỗi .
kho

@rstackhouse, tôi hy vọng bạn đã trải qua một lỗi chưa được xử lý chỉ ra -> nodejs.org/api/ process.html # process_ process_exit_code
MANN

5
Vấn đề với ném là xấu xí như dấu vết địa ngục. Bất kỳ mẹo nào để tránh dấu vết ngăn xếp này (không liên quan khi công cụ CLI muốn thoát nếu sử dụng không đúng)?
MoOx

9

Để thoát

let exitCode = 1;
process.exit(exitCode)

Mã thoát hữu ích

1 - Catchall cho các lỗi chung
2 - Sử dụng sai các nội dung shell (theo tài liệu của Bash)
126 - Lệnh được gọi không thể thực thi
127 - Không tìm thấy lệnh
128 - Đối số không hợp lệ để thoát
128 + n - Tín hiệu lỗi nghiêm trọng
130 - Tập lệnh bị chấm dứt bởi Control-C
255 \ * - Thoát trạng thái ra khỏi phạm vi

Xem xét cập nhật câu trả lời của bạn, nodejs.org/api/ process.html # process_ process_exit_code
Cmag

7

Từ mã bạn có thể sử dụng process.exit([errorcode])ở đâu [errorcode]là một số nguyên tùy chọn ( 0là mặc định để biểu thị thành công).

Nếu bạn đang sử dụng Vòng lặp đọc Eval (REPL) , bạn có thể sử dụng Ctrl+ Dhoặc nhập.exit

Ngoài ra, trên Windows hoặc Linux, bạn có thể sử dụng Ctrl+ C, Ctrl+C

Trên Mac, lệnh là Ctrl+ Z, Ctrl+Z


2
Hai điều khiển c cũng hoạt động trên mac, ít nhất là với tôi với node --version v0.10.18
msouth

Control-C dường như không hủy các hoạt động đã được lên lịch, trong khi ctrl-z giết quá trình mà không bị trì hoãn, trên Mac.
jorisw


3

Tôi đã có thể khiến tất cả các quy trình nút của mình chết trực tiếp từ trình bao Git Bash trên Windows 10 bằng cách gõ taskkill -F -IM node.exe- điều này kết thúc tất cả các quy trình nút trên máy tính của tôi cùng một lúc. Tôi thấy tôi cũng có thể sử dụng taskkill //F //IM node.exe. Không chắc chắn tại sao cả hai -//làm việc trong bối cảnh này. Hi vọng điêu nay co ich!


Đó là do nhiệm vụ chính nó. Bạn đang tự giết quá trình. Ngoài ra, một / là đủ.
Paul Stelian

2

Vì quy trình là đối tượng toàn cầu, bạn không cần nhập bất kỳ mô-đun nào. Hàm sau thoát hoặc giết quá trình nút hiện tại.

process.exit (mã)

process.kill (process.pid)

process.abort ()


1

Mở terminal dòng lệnh nơi ứng dụng nút đang chạy và nhấn Ctrl + C

nếu bạn muốn thoát một ứng dụng nút js khỏi mã,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 

0

nếu bạn muốn thoát khỏi ứng dụng nút js thì hãy viết

process.exit(1)

trong mã của bạn


3
1 được sử dụng để chỉ ra rằng có một lỗi trong ứng dụng, mà các câu trả lời khác đã làm rõ.
Herick

0

Việc thoát trong nút js được thực hiện theo hai cách:

  • Gọi process.exit () một cách rõ ràng.
  • Hoặc, nếu vòng lặp sự kiện của nodejs được thực hiện với tất cả các tác vụ và không còn gì để làm. Sau đó, ứng dụng nút sẽ tự động thoát.

Làm thế nào nó hoạt động?

Nếu bạn muốn buộc vòng lặp thực thi dừng quá trình, bạn có thể sử dụng quy trình biến toàn cục là một thể hiện của EventEuctor . Vì vậy, khi bạn gọi process.exit (), bạn thực sự phát ra sự kiện thoát kết thúc tất cả các tác vụ ngay lập tức ngay cả khi vẫn còn các thao tác không đồng bộ không được thực hiện.

process.exit () lấy mã thoát (Integer) làm tham số. Mã 0 là mặc định và điều này có nghĩa là nó thoát với 'thành công'. Trong khi mã 1 có nghĩa là nó thoát với 'thất bại'.


0

Nếu bạn đang ở trong Windows, hãy chuyển đến Trình quản lý tác vụ, sau đó chuyển đến Quy trình, tìm kiếm một quy trình có tên là "nút", sau đó nhấp vào nút đó bằng nút chuột phải và sau đó nhấp vào tùy chọn "Kết thúc quá trình".


-1

Bạn có thể sử dụng hàm process.exit ([code]) .

Nếu bạn muốn thoát mà không có 'thất bại', bạn sử dụng mã 0:

process.exit(0);

Để thoát với mã 'thất bại', 1bạn có thể chạy:

process.exit(1);

Mã 'thất bại' của lỗi là dành riêng cho ứng dụng. Vì vậy, bạn có thể sử dụng quy ước của riêng bạn cho nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.