1. Cron là gì?

Cron là một tiện ích cho phép thực hiện các tác vụ một cách tự động theo định kỳ, ở chế độ nền của hệ thống. Crontab (CRON TABle) là một file chứa đựng bảng biểu (schedule) của các entries được chạy.

2. Cron làm việc thế nào?

Một cron schedule đơn giản là một text file. Mỗi người dùng có một cron schedule riêng, file này thường nằm ở /var/spool/cron. Crontab files không cho phép bạn tạo hoặc chỉnh sửa trực tiếp với bất kỳ trình text editor nào, trừ phi bạn dùng lệnh crontab.

Một số lệnh thường dùng:

crontab -e: tạo hoặc chỉnh sửa file crontab 
crontab -l: hiển thị file crontab 
crontab -r: xóa file crontab

Hầu hết tất cả VPS đều được cài đặt sẵn crontab, tuy nhiên vẫn có trường hợp VPS không có. Nếu bạn sử dụng lệnh crontab -l mà thấy output trả lại -bash: crontab: command not found thì cần tự cài crontab thủ công.

Cài đặt crontab

Sử dụng lệnh:

yum install cronie

Start crontab và tự động chạy mỗi khi reboot:

service crond start
chkconfig crond on

3. Cấu trúc của crontab

Một crontab file có 5 trường xác định thời gian, cuối cùng là lệnh sẽ được chạy định kỳ, cấu trúc như sau:

*     *     *     *     *     command to be executed
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- day of week (0 - 6) (Sunday=0)
|     |     |     +------- month (1 - 12)
|     |     +--------- day of month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

Nếu một cột được gán ký tự *, nó có nghĩa là tác vụ sau đó sẽ được chạy ở mọi giá trị cho cột đó.

Ví dụ:

– Chạy script 30 phút 1 lần:

0,30 * * * * command

– Chạy script 15 phút 1 lần:

0,15,30,45 * * * * command

– Chạy script vào 3 giờ sáng mỗi ngày:

0 3 * * * command

4. Ví dụ cụ thể

Giả sử mình viết một đoạn script sao lưu toàn bộ thư mục /home/domain.com/public_html/ và chuyển file nén .zip vào thư mục /root/ như sau:

#!/bin/bash
zip -r /root/backup_domain.com_$(date +"%Y-%m-%d").zip /home/domain.com/public_html/ -q

Script này lưu lại ở đường dẫn /etc/backup.sh (gán quyền execute – chmod +x nếu là bash script).

Sau đó mình cho script này chạy định kỳ vào 15h thứ Hai và thứ Năm hàng tuần bằng cách tạo một file crontab như sau:

crontab -e

Nhấn o (chữ o) để thêm dòng mới với nội dung:

0 15 * * 1,4 sh /etc/backup.sh

Để lưu lại và thoát bạn nhấn ESC, rồi gõ vào :wq nhấn Enter.

Cuối cùng, nhớ khởi động lại cron daemon:

/etc/init.d/crond restart

Nếu muốn dùng Editor nano sửa cho dễ thì bạn dùng lệnh sau: EDITOR=nano crontab -e

Ví dụ khác

– Để crontab chạy mỗi phút một lần:

* * * * * sh /etc/backup.sh

– Để crontab chạy 24h một lần (vào nửa đêm):

0 0 * * * sh /etc/backup.sh

– Để crontab chạy file PHP 24h một lần:

0 0 * * * /usr/bin/php /var/www/html/reset.php

5. Disable email

Mặc định cron gửi email cho người thực thi cron job, nếu bạn muốn tắt chức năng gửi email này đi thì hãy thêm đoạn sau vào cuối dòng

>/dev/null 2>&1

Ví dụ:

0 15 * * 1,4 sh /etc/backup.sh >/dev/null 2>&1

6. Tạo log file

Để lưu log vào file:

30 18 * * * rm /home/someuser/tmp/* > /home/someuser/cronlogs/clean_tmp_dir.log

67 Comments

  1. Chu Tiến Diện 1 comment

    [bug]: chào cả nhà:
    khi em chạy cronjob nó có báo lỗi như sau exec() has been disabled for security reasons
    và mã lệnh thực thi của em chưa có hiệu lực

    Mọi người có thể giúp em được ko ạ

    1. Luân Trần Admin

      Bạn mở file /etc/php.ini ra, tìm dòng disable_function rồi xóa exec đi, restart php-fpm là được.

    2. khai 2 comment

      Hi anh Luân em cài đặt giống thế.nhưng khi chạy crontab không thấy hiện tượng gì.
      a có skype support giúp e phát.em cảm ơn.

        1. khai 2 comment

          em cảm ơn anh.em tìm hiểu được rồi anh ạ.đó là file log của em được nghi ở thư mục khác

  2. Phước 1 comment

    Em cài hocvps trên vultr tạo cron xong e chạy “/etc/init.d/crond restart” nhưng nó báo lỗi “No such file or…” xử lý thế nào anh

  3. nanami 1 comment

    hi anh
    cho em hỏi tại sao em sửa nội dung file script. khi chạy trực tiếp script thì cho ra kêt quả đúng. Nhưng khi dùng crontab chạy script đấy thì lại ra kết quả khác ?

  4. Thi Nguyen 1 comment

    Mình có sử dụng crontab , tuy nhiên tính năng này tự động lưu các file về thư muc root (/home) làm nhiều dữ liệu của mình bị chồng lên nhau. Có cách nào phân loại ra không vì mình chạy 2 đoạn crontab.

    Cảm ơn bạn đã hỗ trợ

  5. Nhân 1 comment

    Mọi người cho mình hỏi email admin set ở đâu thế.
    Còn crontab thì sao canh 2 ngày chạy được mọi người nhỉ, nếu tháng 31 ngày thì có vẻ ko ổn.
    Cảm ơn mọi người

  6. Nguyen Quang Trinh 1 comment

    Anh Luân giúp em viết đoạn script tự động khởi động lại firefox với ạ.

    1. Việt Phương Moderator

      Có thể hiểu là user root chưa có bất kỳ 1 lịch chạy nào trong crontab nên # crontab -l báo thế. Kiểm tra lại crontab file bạn tạo nhé

  7. Vy 1 comment

    Chào anh Luân.
    Cho em hỏi làm thế nào để tự động backup website ở VPS Vultr về vps lưu trữ tại Ramnode với ạ?
    Anh có thể gợi ý các bước hay chương trình cần dùng, em có thể tự tìm hiểu kỹ hơn.

  8. hoàng 1 comment

    xác nhận ghi lại người đăng nhập hệ thống tần xuất 1h/1 lần vào file log.txt thì phải làm sao ạ

Comment của bạn

Your email address will not be published. Required fields are marked *