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

Comment của bạn

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

124 Comments

  1. Sugu99 2 comment

    Nếu trong lệnh mà có đoạn bắt nhập mật khẩu để ssh thì làm thê nào để chạy đc crontab vậy admin

    1. Việt Phương Moderator

      Bạn crontab truy cập vào VPS khác? Thế bạn thiết lập SSH Keys rồi đăng nhập dùng SSH Keys trong câu lệnh luôn
      Câu lệnh bạn ntn?

      1. sugu99 2 comment

        Em em vẫn muốn dùng mật khẩu và chạy crontab, lệnh của em sẽ ssh vào:
        0,10 * * * * rsync –remove-source-files -avzhe ssh root@210.245.x.x:/backupxxx backupSRVxxx

  2. Nguyễn Long 17 comment

    Muốn tạo crontab curl theo giây, ví dụ 10 giây request 1 lần thì viết thế nào mọi người?

  3. Nguyen Dinh Phu 5 comment

    Có cách nào cho PHP nó tự tạo cronjob ko bạn ơi.
    Ví dụ mình add 1 tác vụ nào bằng PHP rồi cho nó set tự chạy theo mình yêu cầu ấy.
    Mình cài hocvps xong rồi sử dụng shell_exec(‘lệnh’); nhưng không được

  4. Song Thai Tung 19 comment

    Ad cho hỏi, mình muốn tạo 1 cronjob tự động chèn một đoạn text vào 1 chỗ vd:
    File=”
    mình muốn chèn đoạn text vào giữa ” ở trên thì câu lệnh gì nhỉ?

    1. Việt Phương Moderator

      Vấn đề này mình không rõ rồi. Bạn nghiên cứu thêm về câu lệnh find và sed trong Linux nhé

      1. chupy 117 comment

        3 2 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 1,2,3,4,5,6,7,8,9,10,11,12 1,2,3,4,5,6,0 /sbin/reboot

        Lệnh này ko biết đúng chưa bạn nhỉ

          1. Việt Phương Moderator

            Sai rồi. Bạn đọc lại bài viết nhé, hoặc sử dụng công cụ crontab mình post trong comment

    1. Việt Phương Moderator

      tùy cái hoạt động cron của bạn nên bạn test mới biết nhé

  5. dũng 117 comment

    Luân cho mình hỏi muốn tạo Crontab tự động rebot sever thì dùng câu lệnh nào ạ . 1 ngày 1 lần ấy

  6. kính 16 comment

    chào Ad, mình tạo 1 crontab chạy vào lúc 12h và 1 crontab chạy vào lúc 12h03′, cho mình hỏi crontab thứ nhất chạy tầm 30′ mới xong, khi đó crontab thứ 2 có chạy đè lên crontab thứ 1 hay không hay là 2 crontab này chạy song song, xin cảm ơn.

    1. Việt Phương Moderator

      Mình chưa làm thế bao giờ không rõ. Nhưng mình nghĩ ok thôi, đa nhiệm của hệ điều hành mà

      1. kính 16 comment

        nhờ bạn xem giúp mình tạo cron này đúng hay sai ạ.

        30 23 * * * find /home/nginx/domains/hangmygiasi.net/public/wp-content/uploads/ -type d | sort | while read d; do echo “optimise directory: $d”; echo “/root/tools/optimise-images/optimise-images.sh optimise-cron-age $d”; /root/tools/optimise-images/optimise-images.sh optimise-cron-age $d; done > /dev/null

        Link Tham khảo: https://github.com/centminmod/optimise-images#unattended-subdirectory-runs

        1. Việt Phương Moderator

          Các crontab yêu cầu lệnh thực thi được gọi từ nguồn nhé bạn. Ví dụ trên SSH bạn có thể gõ shutdown nhưng add vào crontab phải add /sbin/shutdown
          Và trường hợp bạn nên viết thành script rồi cho crontab cái script đó nhé

          1. kính 16 comment

            bạn có thể giúp mình viết luôn script này sao ko bạn. cảm ơn bạn rất nhiều

          2. Việt Phương Moderator

            Bạn tự viết nhé. Dạng script chuỗi lệnh liên tiếp