Cách tạo cronjob cho 1 file node js

Hi mn, em đang muốn cron chạy tự động 1p 1 lần ( file này để update dữ liệu trong db) thì làm ntn ạ,e search thì chưa hiểu lắm.

ở php thì e viết code ra 1 file rồi thêm cron bằng crontab -e , rồi dùng * * * * * curl link-to-php , thì đối với nodejs e convert code từ php sang nodejs rồi thì cron ntn ạ. e cảm ơn

var express = require('express');
var app = express();
app.get('/cron', function (req, res) {
  //code
});
app.listen(8888);

hay là viết code rồi cron là * * * * * curl IP:8888/cron , có phải ko ah.

Nếu cậu deploy node JS app như một API server, thì cậu chỉ cần tạo cronjob curl tới API thôi.
Nếu cậu muốn dùng cronjob để kick một node js script chạy, cậu cần cung cấp câu lệnh để chạy script đó, kiểu này:

## Cronjob entry, run the app.js script every minute
* * * * * node /path/to/your/app.js

Hope it helps!

4 Likes

em đang chạy như 1 api server, nhưng mà lúc chạy phải run node <file.js> trước thì server mới open và truy cập được. vậy cron thì mình dùng pm2 để run file js đó cho server open trước à a

với cả code chỉ để xử lí trong db thôi thì nên chạy theo cách nào để nhanh hơn ạ.

Oh, vậy cậu chỉ cần chạy node <file.js> ở background trước là được.

nohup node <file.js> &

Lúc này, kể cả khi cậu terminate session, cronjob vẫn có thể gọi được API.

Nếu cậu đã có sẵn API server thì hẳn là dùng cronjob với curl sẽ nhanh hơn :sweat_smile: Và có vẻ như cậu cũng quen với cách này hơn thì phải.
Gọn gàng nhất vẫn là tạo 1 script mới và kick nó chạy mỗi phút một lần, như thế đỡ tốn resource hơn cho cậu.

3 Likes

ý e là nhanh về performance chứ không phải thời gian code ạ :v chắc là node <file.js> sẽ nhanh hơnt vì nó k fai tạo server với k fai dùng đến curl

Oh, cậu tự trả lời đúng rồi đó :smile:

4 Likes

hi a, a cho e hoỉ là mặc định thì max execute time của 1 script nodejs là mấy phút nhỉ, như php thì set ở php.ini max_execute_time, nodejs thì mình set ntn ạ. file js cần cron của e là script thôi k chạy server.

Tớ không rõ có concept max execution time trong node JS không, cơ mà có vẻ có gì đó sai sai khi cậu hỏi điều này :smile:

Việc cậu terminate một script đang thao tác tới DB có thể khiến dữ liệu của cậu ở trạng thái rất khó để khôi phục. Chí ít, cậu nên để script hoàn thành xong công việc với database của cậu.
Mặt khác:

  • Script cronjob nên lightweight
  • Script cronjob cũng nên hoàn thành xong công việc trước lần thực hiện tiếp theo. Nếu không thể, ít nhất cậu cũng nên để script cronjob không gặp vấn đề gì khi thực hiện nhiều lần một lúc.
    Cậu hoàn toàn có thể đặt 1 file đóng vai trò lock, mỗi khi script được chạy, nó sẽ kiểm tra file lock kia. Nếu file đã tồn tại, script chỉ cần skip lần chạy, còn nếu file chưa tồn tại, script tạo file lock đó và thực hiện task, rồi xóa file lock khi công việc hoàn thành.

Thế nên, hoặc cậu cần cân nhắc design lại script cronjob của cậu, hoặc thay đổi tần suất thực hiện task.

Hope it helps!

6 Likes

em đang viết thêm 1 file nodejs mới, không update gì trong db nữa nên ko lo bị hỏng dữ liệu trong db, mà lấy dữ liệu ở db để xử lí tác vụ khác, tác vụ này khá lâu, mỗi lần chạy file js này thì sẽ thực hiện 5 lần task này (vòng while lấy data 5 rows trong db). nên em sợ là khi chưa hoàn thành xong 5 task thì nó bị timeout như php ( ví dụ php có cái max_execute_time mà để là 2 phút (max_execute_time 120) trong khi xong task phải 5 phút thì nó sẽ bị timeout. ý e hỏi là trong nodejs có bị trường hợp này không ạ (file js của e ít nhất 2 phút mới done) và nếu bị thì có cách nào tăng time execute lên không ạ.

Nếu cậu dùng API call, thì có timeout đó. Nhưng nếu cậu chỉ kick 1 script nodejs, tớ nghĩ là không có timeout đâu.
Cậu nên test để verify lại nha :smile:

4 Likes

Trong Node.js không có khái niệm timeout nên bạn không phải lo, cái duy nhất mà bạn cần lo là khi có lỗi xảy ra mà bạn không handle (như gửi request mà không thấy server trả response chẳng hạn).

4 Likes

hihi em hỉu rùi , e mới học nodejs để viết lại từ php qua xem performance có ngon hơn không, nhưng vì yêu cầu của script nên vẫn phải sync để chờ response thì mới xử lí tiếp được nên ko thể dùng thế mạnh async của javascript nên chỉ nhanh hơn được vài giây, nhưng ko có timeout thì cũng ok ý ah hihi

trường hợp chạy file đó dưới dạng server thì khi truy cập ở trình duyệt thì có timeout ko ạ?

Đối với Node.js thì chương trình chỉ dừng khi không còn gì để chạy (dùng Express thì không gặp), tự thoát chương trình hoặc gặp lỗi mà không handle. Khi trình duyệt truy cập thì chỉ bị timeout ở trình duyệt, server không gặp vấn đề gì.

2 Likes

a ơi e cron file đó 1p 1 lần , ram vps lúc nào cũng 90%, có cách nào để nó đỡ ngốn ram ko ạ hay phải nâng ram lên nhỉ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?