Hướng dẫn process exit nodejs - quá trình thoát nodejs

Thực hiện exit, shutdown, thoát chương trình trong Node.js

Trong Java để thoát chương trình hoặc tắt chương trình bằng code, ta có lệnh System.exit(), với Python là quit(), exit()

Vậy muốn thoát khỏi chương trình Node.js ta phải làm như nào?

Có khá nhiều cách để thoát, tắt chương trình Node.js, mỗi cách thích hợp cho từng tình huống khác nhau.

1. Bắt sự kiện exit trong node.js

Để bắt sự kiện exit trong Node.js ta sử dụng lệnh process.on('exit', callback)

Ví dụ:

console.log('Hello stackjava.com');

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});

Demo:

Hướng dẫn process exit nodejs - quá trình thoát nodejs

Đầu vào của callback là một exit code, Node.js hiểu exit code = 0 là thành công, khác 0 là thất bại.

2.1 Sử dụng process.exit() để tắt tiến trình Node.jsđể tắt tiến trình Node.js

process.exit được dùng để tắt tiến trình Node.js hiện tại với đầu vào là một exit code.

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});
0 là một biến global và không cần phải
setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});
1 hay
setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});
2 để sử dụng, do đó ta có thể gọi process.exit ở bất kỳ vị trí nào trong chương trình.

Ví dụ:

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});

Đầu vào của callback là một exit code, Node.js hiểu exit code = 0 là thành công, khác 0 là thất bại.

Hướng dẫn process exit nodejs - quá trình thoát nodejs

2.1 Sử dụng process.exit() để tắt tiến trình Node.js

process.exit được dùng để tắt tiến trình Node.js hiện tại với đầu vào là một exit code.

Ví dụ:

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

setTimeout((function() {  
    return process.kill(process.pid);
}), 3000);

Đầu vào của callback là một exit code, Node.js hiểu exit code = 0 là thành công, khác 0 là thất bại.

Demo:

Hướng dẫn process exit nodejs - quá trình thoát nodejs

2.1 Sử dụng process.exit() để tắt tiến trình Node.js

process.exit được dùng để tắt tiến trình Node.js hiện tại với đầu vào là một exit code.

Ví dụ:

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

setTimeout((function() {  
    return process.abort();
}), 3000);

Demo:

Hướng dẫn process exit nodejs - quá trình thoát nodejs

Đầu vào của callback là một exit code, Node.js hiểu exit code = 0 là thành công, khác 0 là thất bại.

References:

https://nodejs.org/api/process.html

Nó phụ thuộc vào lý do tại sao bạn sẵn sàng thoát khỏi quy trình Node.js, nhưng trong mọi trường hợp,

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});
9 là lựa chọn cuối cùng để xem xét. Một trích dẫn từ tài liệu:last option to consider. A quote from documentation:

Điều quan trọng cần lưu ý là gọi NO___Trans___Pre___19 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 thành NO___Trans___Pre___21 và NO___Trans___Pre___22.

Trong hầu hết các tình huống, thực sự không cần thiết phải gọi

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});
9 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 đang chờ xử lý trong vòng lặp sự kiện. Thuộc tính NO___TRANS___PRE___24 có thể được đặt để cho biết quá trình sử dụng mã thoát nào khi quá trình thoát ra một cách duyên dáng.

Hãy để bao gồm các lý do có thể tại sao bạn có thể sẵn sàng thoát khỏi quy trình Node.js và lý do tại sao bạn nên tránh NO___TRANS___PRE___19:

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 đã đạt đến kết thúc và trình thông dịch nút không thoát ra, nó chỉ ra rằng một số hoạt động async vẫn đang chờ xử lý. Nó đã sai khi buộc quá trình chấm dứt với NO___Trans___Pre___19 tại thời điểm này. Nó tốt hơn để cố gắng hiểu những gì đang giữ kịch bản của bạn khỏi thoát theo cách dự kiến. Và khi bạn giải quyết điều này, bạn có thể sử dụng

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

setTimeout((function() {  
    return process.kill(process.pid);
}), 3000);
4 để 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/other)

Ví dụ, nếu bạn có thể sẵn sàng tắt một ứng dụng Express 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ô hạn, chờ đợi các yêu cầu mới.

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});
9 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 cung cấp. Và một số trong số chúng có thể không phải là không có ý nghĩa (cập nhật, xóa). Khách hàng sẽ không bao giờ biết liệu các yêu cầu đó có được hoàn thành hay không ở phía máy chủ hay không và đó có thể là lý do của sự không nhất quán dữ liệu giữa máy khách và máy chủ. Giải pháp tốt duy nhất là nói với HTTP Server ngừng chấp nhận các yêu cầu mới và chờ đợi các yêu cầu đang chờ xử lý với
setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

setTimeout((function() {  
    return process.kill(process.pid);
}), 3000);
9:express app. Unlike command line script, express app keeps running infinitely, waiting for new requests.
setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

// tắt chương trình sau 3s
setTimeout((function() {  
    return process.exit(10);
}), 3000);

process.on('exit', function(code) {  
    return console.log(`App exit with code ${code}`);
});
9 will be a bad option here because it’s going to interrupt all requests which are in pipeline. And some of them might be non-idempotent (UPDATE, DELETE). Client will never know if those requests are completed or not on server side and it might be the reason of data inconsistency between client and server. The only good solution is to tell http server to stop accepting new requests and wait for pending ones to finish with
setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

setTimeout((function() {  
    return process.kill(process.pid);
}), 3000);
9:

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ộ

Nó luôn luôn tốt hơn với NO___TRANS___PRE___30 Một lỗi, bạn sẽ nhận được một dấu vết ngăn xếp và lỗi được định dạng độc đáo. Các cấp độ cao hơn của mã luôn có thể quyết định xem họ có thể xử lý lỗi không (no___trans___pre___31) hoặc để nó làm hỏng quá trình. Ở phía bên kia,

setInterval((function() {  
    console.log('Hello stackjava.com');
}), 1000);

setTimeout((function() {  
    return process.abort();
}), 3000);
2 sẽ chấm dứt quy trình một cách â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 của NO___Trans___Pre___19, bạn có thể chắc chắn rằng quy trình đó sẽ bị chấm dứt.