Lệnh được sử dụng để thoát là gì? (tức là chấm dứt quá trình Node.js)
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:
Gọi phương thức process
của đối tượng toàn cầu exit
:
process.exit()
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
.
exit
khô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.
mod_php
hoặ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.
process.exit()
là không được khuyến khích , như mô tả trong câu trả lời dưới đây .
Chỉ cần một lưu ý rằng việc sử dụng process.exit([number])
là 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 đếnprocess.stdout
vàprocess.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ácprocess.exitCode
bấ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.stdout
và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ọiprocess.exit()
, tuy nhiên, buộc quá trình phải thoát ra trước khi những lần ghi bổ sung đóstdout
có thể được thực hiện.Thay vì gọi
process.exit()
trực tiếp, mã nên đặtprocess.exitCode
và 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; }
process.exit()
được dự định.
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);
code = 0; process.exit(code);
code
?
process.exit()
không có tham số nào khi mã mặc định là 0
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.js
vs node exit_0.js
(bạn có thể kiểm tra bằng cách thực hiện node exit_1.js
và sau đó thực hiện echo $?
).
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ì ...
.exit
và nhấn Enter, hoặcnode
REPL, Ctrl + D để thoát là một hành vi tiêu chuẩn, do đó, nó cũng hoạt động trên Windows.
Từ dòng lệnh, .exit
là 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])
.
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()
là 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 đếnprocess.stdout
vàprocess.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ácprocess.exitCode
bấ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()
:
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.
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.
throw
Lỗ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.
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')
REPL (Dòng lệnh)
Nhấn ctrl + c
hai lần
Nhập .exit
và 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
Tôi có một ứng dụng mà tôi muốn:
Tôi đã phải nối process.exit(code)
với một bộ exit
xử 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); });
process.exitCode
là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.
process.exitCode = 1
, quá trình thoát với mã 0.
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");
Để 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
Từ mã bạn có thể sử dụng process.exit([errorcode])
ở đâu [errorcode]
là một số nguyên tùy chọn ( 0
là 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
node --version
v0.10.18
Nhấn Ctrl + C
hai lần hoặc .exit
.
>
(To exit, press ^C again or type .exit)
>
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 -
và //
làm việc trong bối cảnh này. Hi vọng điêu nay co ich!
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 ()
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
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
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'.
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".
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', 1
bạ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ó.
end()
yêu cầu. Nếu không, nó sẽ bị treo.