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

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

143 Comments

  1. Đình Đông 3 comment

    chào ad, cho mình hỏi là mình có tạo 1 file sh để backup mongo db và sync db được backup lên amazon s3. khi mình chạy file sh đó thủ công thì db được backup và sau đó đồng bộ hóa được lên s3. nhưng khi mình dùng crontab để chạy thì db chỉ backup được sau đó thì không sync được. trong file log có hiện aws: not found. Không biết mình đang gặp vấn đề gì. cám ơn ad

    1. Việt Phương Moderator

      Lệnh sync trong SH bạn để như thế nào? Vì qua crontab phải định vị đúng lệnh sẽ dùng

      1. Đình Đông 3 comment

        Đây ạ File sh:
        mongodump -d dathangtietkiem_db –out /home/mongo_backup/database_bk/db-bk-`date +\%d-\%m-\%Y` -u ‘user’ –authenticationDatabase ‘db’ –authenticationMechanism ‘SCRAM-SHA-1’ -p ‘1234’ &&
        aws s3 sync /home/mongo_backup/database_bk s3://abc/backup-db-servermongo &&
        echo “backup”
        còn đây là cronjob:
        30 2 * * * sh /home/mongo_backup/backup.sh > /home/mongo_backup/logsBackup 2>&1

      2. Đình Đông 3 comment

        Đây là nội dung cronjob:
        30 2 * * * sh /home/mongo_backup/backup.sh > /home/mongo_backup/logsBackup 2>&1
        Còn đay là nội dung file sh

        mongodump -d dhk_db–out /home/mongo_backup/database_bk/db-bk-`date +\%d-\%m-\%Y` -u ‘user’ –authenticationDatabase ‘db’ –authenticationMechanism ‘SCRAM-SHA-1’ -p ‘1234’ &&
        aws s3 sync /home/mongo_backup/database_bk s3://bk/backup-db-servermongo &&
        echo “backupdata…”

        1. Việt Phương Moderator

          Nghi là lệnh aws nó không hiểu. Bạn cho hẳn đường dẫn lệnh vào crontab đi
          Ví dụ /usr/local/bin/aws
          Cách tìm vị trí aws: which aws

  2. KaThy Nguyễn 1 comment

    Anh ơi cho em hỏi em có tạo 3 cron:
    cron 1 – 10p chạy 1 lần,
    cron 2 – 10p chạy 1 lần,
    cron 3 – 1p chạy 1 lần

    cron 1 chạy đầu tiên mất khoảng 5p chẳng hạn . Trong khoảng 5 phút đó thì cron 2 vào hàng đợi , tương tự như vậy với cron 3 và lặp lại cron 1 thì phải làm sao anh ?

  3. pháp 13 comment

    cronjob của mình chạy mà không gửi mail về nhỉ?
    mình đã thêm dòng mailto ở đầu file rồi mà vẫn k thấy gửi mail.

    lệnh cron của mình là: 0 8,12,16,20 * * * cd /home/script && php ps.php
    kiểm tra file log thì vẫn thấy có chạy cron này

    1. Việt Phương Moderator

      Toàn bộ nội dung ps.php không được thực thi hay chỉ dòng mailto?

  4. thue xe limousine 7 comment

    trạng thái cron thì vẫn hoạt động mà nó lại không chạy ,lệnh này thì không thực hiện được /etc/init.d/crond restart tìm cũng không thấy file đó tron thư mục lun .

    1. Việt Phương Moderator

      Bạn có thể restart crontab bằng
      service crond restart
      Còn cronjob không chạy thì bạn check log trong /var/log/cron nhé

      1. thue xe limousine 7 comment

        em centos7x của mình tìm ko ra /var/log/cron lun nhỉ ,cron mình check lại vẫn hoạt động bình thường ,có lẽ cái shell mình viết có vấn đề ,mình vẫn chưa mò ra khi chạy file trược tiếp thì ẻm chạy bình thường ,khi chạy bằng cron thì nó vẫn chạy mà ko thấy kết quả ,đắng lòng thật cùng code như nhau mà 1 vps chạy được 1 vps nó bị tễnh tễnh ,cảm ơn bạn nhiều nha .

        1. Việt Phương Moderator

          Nhiều cron bạn phải chỉ rõ lệnh nhé
          Ví dụ thay vì service thì phải là /usr/sbin/service trong cron mới đc

  5. hoàng hiếu 1 comment

    Chào anh, em muốn tạo 1 cron để truy cập vào website 30p 1 lần để plugin pipes tự động lấy tin theo thời gian đấy, thì em phải viết thế nào cho đúng hả anh?
    Đoạn code của em viết như phía dưới, nhưng không biết có đúng không a? Anh vui lòng giải đáp giúp em với ạ.
    (crontab -u root -l ; echo “*/30 * * * * /home/backup”) | crontab -u root –

    1. Việt Phương Moderator

      Đoạn trên bạn đâu phải để chèn vào crontab. Còn chèn thì bạn cứ chèn như trong bài viết thôi, phần */30 * * * * /home/backup

  6. Dai Nguyen 11 comment

    Cho mình hỏi, nếu chạy 2 cron giống nhau cùng lúc được không?
    Vì crontab tối thiểu chạy 1 phút 1 lần, mình muốn 30 giây nó chạy 1 lần.

    Xin cảm ơn.

  7. 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

  8. Nguyễn Long 23 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?

  9. Nguyen Dinh Phu 8 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

  10. Song Thai Tung 20 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 119 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é

  11. dũng 119 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

  12. 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