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
Để cron chạy 3 ngày 1 lần, mình cấu hình:
* * */3 * * wget -O /dev/null http://domain.com/file.php
Thiết lập như trên đúng không bác ?
Làm thế nào để chạy một cron bên trong một container docker vậy
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
Lệnh sync trong SH bạn để như thế nào? Vì qua crontab phải định vị đúng lệnh sẽ dùng
Đâ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
Đâ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…”
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
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 ?
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
Toàn bộ nội dung ps.php không được thực thi hay chỉ dòng mailto?
chỉ có mailto thôi chứ cronjob vẫn thực thi bình thường
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 .
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é
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 .
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
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 –
Đ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
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.
Thì nó chạy lặp chứ không phải 30s nó chạy lần. Crontab không xử lý theo giây nhé. Nếu muốn thiết lập, bạn cần tạo shell script riêng để chạy rồi nghỉ sau x giây rồi chạy
Tham khảo: https://stackoverflow.com/questions/9619362/running-a-cron-every-30-seconds
Làm thế nào để biết được crontab đó có chạy không nhỉ Ad?
Ví dụ mỗi 15m xóa cache 1 lần chẳng hạn.
Bạn đọc nội dung
/var/log/cron
nhé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
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?
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
Bạn tham khảo bài viết này nhé. https://serverfault.com/questions/241588/how-to-automate-ssh-login-with-password
Thường ko kèm pass trong câu lệnh để tránh lộ nên tạo SSH Keys
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?
Crontab không xử lý theo giây nhé. Nếu muốn thiết lập, bạn cần tạo shell script riêng để chạy rồi nghỉ sau 9 giây rồi chạy
Tham khảo: https://stackoverflow.com/questions/9619362/running-a-cron-every-30-seconds
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
Việc để PHP chạy lệnh SSH mình không rõ rồi
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ỉ?
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é
Luân cho hỏi cách tạo 1 crontab tự động reboot sever vào giờ cố định hàng ngày dc ko ạ
Lệnh reboot là
/sbin/reboot
bạn nhé. Time bạn tự tùy chỉnh theo nhu cầuhttps://hocvps.com/crontab/
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ỉ
mình muốn lập lịch 3 tiếng rebot 1 lần ấy bác
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
Anh cho em hỏi em chạy site cần chạy nhiều cron thì nên dùng vps ram cao hay cpu cao ạ ?
tùy cái hoạt động cron của bạn nên bạn test mới biết nhé
Em chạy Cron quét tường tầm 200 facebook xong chạy like cho cái ID ấy ạ tầm 400like/ID ạ
Bạn test mới biết được. Mình không chạy job ý nên không rõ
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
Lệnh reboot là
/sbin/reboot
bạn nhé. Time bạn tự tùy chỉnh theo nhu cầuhttps://hocvps.com/crontab/
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.
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à
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
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é
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
Bạn tự viết nhé. Dạng script chuỗi lệnh liên tiếp