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.

Học VPS mới bổ sung công cụ tạo Crontab với giao diện trực quan, rất dễ sử dụng. Mời các bạn tham khảo.

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

86 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 ạ

      1. Việt Phương Moderator

        Hình nhưu bạn thiết lập sai về thời gian chạy của dòng lệnh. Thường lỗi do đã xuống dòng trong 1 dòng lệnh.
        Ví dụ 0 2 * * * wget –spider -O – http://abc.xyz/index.php/cronjob/post > /dev/null 2>&1 để chạy lệnh của bạn lúc 2h AM hàng ngày

  9. Hùng 12 comment

    mình đang dùng host cpanel và dùng cron job trên cpanel chạy các lệnh dưới đó. Mình muốn chuyển qua VPS nhưng không biết trên VPS chạy các lệnh như ở dưới như thế nào cho cái plugin nó làm việc

    Once Per Hour Cron URL: wget -O /dev/null http://www.vvvlives.com/wp-content/plugins/Machine/auto.php
    Once Per Day Cron URL: wget -O /dev/null http://www.vvvlives.com/wp-content/plugins/Machine/auto2.php
    Twice Per Hour Cron URL: wget -O /dev/null http://www.vvvlives.com/wp-content/plugins/Machine/auto3.php

    1. Việt Phương Moderator

      1. Lệnh đó bạn chạy ở terminal được bình thường?
      2. 0 0 8 * * * curl http://localhost/csm/index.php/cronjob bạn nhé. Xong bạn kiểm tra log ở /var/log/cron xem chạy không

      1. Nguyễn Danh Phương 4 comment

        Trong /var/log/ không thấy bác ạ. Lệnh nào để kiểm tra vậy bác?

        1. Quách Chí Cường 7 comment

          Bạn xài CentOS thì thường có log cron ở ‘/var/log/cron’.

          # tail -f /var/log/cron

          1. Bạn check xem service cron có chạy không ?
          # ps auxfw | grep -v “grep” | grep -i “cron”

          -> Nếu chưa start cron thì start lên.
          # service cron start

          2. Bạn check thử trường hợp, thời gian dịch vụ cron sử dụng có bị lệch time với thời gian hệ thống hay không ? Có thể tham khảo bài này : https://cuongquach.com/linux-fix-loi-cronjobs-chay-sai-gio-he-thong.html

          3. Nếu cron chưa được cài trên OS của bạn, thì kiểm tra cài lại như trong bài nhé.

          Thân.

    1. Việt Phương Moderator

      Đúng rồi. Nhưng bạn chạy mỗi lệnh curl http://domain.com/cron.php trên terminal SSH trc xem có tác dụng không thì crontab tự động chạy lệnh ý mỗi phút

        1. Việt Phương Moderator

          Thường vấn đề nằm ở lệnh chứ không ở cron. Không nhầm thì bạn cần wget cái php cronjob ý chứ không phải curl
          Còn kiểm tra cron bạn xem service crond status và nội dung /var/log/cron sẽ thấy lệnh ý có được chạy mỗi phút không

          1. Nguyễn Quốc Thông 4 comment

            lệnh này * * * * * wget http://domain.com/botlike.php
            nó báo lỗi -bash: *: command not found
            Giúp với ạ

          2. Việt Phương Moderator

            Nó là trong crontab không phải lệnh ngoài. Khi đó * hiểu là thời gian, không phải lệnh thực thi. Lệnh thực thi tính từ wget
            Còn nếu chạy ở terminal mới là wget http://domain.com/botlike.php

          3. Việt Phương Moderator

            Như mình bảo đó. wget http://domain.com/botlike.php là chạy bên ngoài. Còn add vào crontab thì add * * * * * wget http://domain.com/botlike.php

    1. Việt Phương Moderator

      Bạn chạy thủ công /sbin/reboot ok thì add vào crontab dòng này 0 0 * * * /sbin/reboot
      Reboot VPS lúc 0h00

Comment của bạn

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