Cron là gì

Trên Unix/Linux bạn thường nghe đến cái tên Cron...
Vậy Cron là cái gì nhỉ? Trước hết Cron là một chương trình. Do sự tiện dụng và cần thiết của nó lên đã được nâng lên làm deadmon.
Vậy nó có chức năng gì ? Chắc bạn không lạ gì chương trình Scheduling Agent chuyên được dùng để thực hiện các tác vụ theo định kỳ đã được lên kế hoạch và thời gian trước. Thì Cron sẽ thay bạn thực hiện tính năng này trong Unix/Linux.
 
Thường thì cron được cài đặt mặc định và chạy trên các hệ thống Unix/Linux rồi. Nếu hệ thống của bạn chưa được cài đặt Cron thì bạn có thể Dowload nó từ:http://www.freshmeat.net/ Và cần cho khởi động nó như một deadmon trên hệ thống của bạn bằng lệnh:
root@localhost#: crond start
 
Bây giờ chúng ta cùng bắt tay cấu hình cho Cron. Để sử dụng Cron bạn phải, bạn cần một file cấu hình dạng text, còn gọi là file "lịch" (để lên lịch chạy của các chương trình). Ngoài ra bạn sẽ phải dùng thêm chương trình crontab (có sau khi cài cron) để đăng ký file lịch với hệ thống, xem thông tin về file lịch của user... 
Bạn có thể đặt tên cho file lịch là jobs.txt hoặc schedule.txt hay tên gì đó cũng được, miễn nó là file text. Cấu trúc của file lịch như sau: 
* File lịch gồm có 2 phần, phần đầu là phần cấu hình, có dạng TÊN_BIẾN = GIÁ TRỊ
* Phần thứ hai là lịch trình chạy của các chương trình
* Các chú thích bắt đầu bằng ký tự #
(bạn xem thêm thông tin qua lệnh man crontab
Phần cấu hình của file lịch (có thể) như sau:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=abc
HOME=/
 # run-parts 
Dòng đầu tiên cho biết là bạn dùng shell bash để chạy các chương trình, dòng thứ 2 thiết lập đường dẫn cho các chương trình (tuỳ chọn), dòng thứ 3 biểu thị rằng output của các chương trình sẽ được gởi tới email cho user abc (tuỳ chọn, mặc định sẽ gởi email tới cho user chủ sở hữu của file lịch, nếu bạn không muốn gởi email thì bạn đặt MAILTO=""), dòng thứ 4 sẽ báo cho cron biết rằng phải cd về thư mục gốc trước khi thi hành lệnh. 
Phần lịch trình chạy các chương trình có dạng như sau:
phút giờ ngày tháng thứ chương_trình_cần_chạyPhút có giá trị từ 0 đến 59 hoặc là *
Giờ có giá trị từ 0 đến 23 hoặc *
Ngày có giá trị 1 đến 31 hoặc *
Tháng có giá trị từ 1 đến 12 hoặc *
Thứ có giá trị 0 (Chủ nhật), 1 (thứ hai)...6 (thứ 7) hoặc * 
Ví dụ bạn muốn chạy chương trình abc vào lúc 2g1' sáng ngày 12 tháng 5 (bất kể thứ) thì lịch chạy như sau:
1 2 12 5 * abc(* biểu thị everything, tức là bất kể thứ nào) 
Nếu bạn muốn chạy 1 file tên def trong thư mục /bin vào 15g chiều vào chủ nhật (bất kể ngày tháng) thì lịch chạy như sau:
0 15 * * 0 /bin/def 
và nếu bạn muốn chạy 1 chương trình tên xyz vào mỗi giờ trong ngày (bắt đầu ở phút thứ 8 của giờ đó) thì:
8 * * * * xyz 
còn nếu bạn muốn chương trình cứ 3 ngày chạy 1 lần vào đúng 4g10' sáng? thì đây:
10 4 */3 * * tên_chương_trình(*/3 biểu thị cứ cách 3 đơn bị thì thực hiện 2 lần, ở ví dụ trên 1 đơn vị là 1 ngày nên 3 ngày chương trình sẽ chạy 1 lần) 
Nếu bạn muốn chạy chương trình ngày 3 lần (cứ 8 tiếng đồng hồ thì chạy 1 lần) vào lúc 13 phút hàng tuần (trừ Thứ 7 và Chủ nhật) thì:
13 */8 * * 1-5 tên_chương_trình(1-5 biểu thị trong giới hạn từ 1 đến 5 thì thực hiện, ở ví dụ trên 1 là thứ 2, 5 là thứ 6, 1-5 biểu thị từ thứ 2 đến thứ 6) 
Và cuối cùng, sau khi soạn thảo và lưu lai file lịch ở dạng text. Bạn đăng ký file lịch với hệ thống qua lệnh crontab:
crontab schedules.txt 
Mỗi user trên hệ thống linux của bạn có thể tạo 1 file lịch khác nhau và đăng ký với hệ thống, 2 user khác nhau sẽ có file lịch khác nhau và không sợ bị ghi dè lên nhau. lệnh crontab -l sẽ liệt kê file lịch mà bạn đã đăng ký với hệ thống. Nếu bạn đăng ký nhiều file lịch, thì file sau sẽ ghi đè lên file trước.
Syntax of crontab

Your cron job looks like as follows:
1 2 3 4 5 /path/to/command arg1 arg2
Where,
  • 1: Minute (0-59)
  • 2: Hours (0-23)
  • 3: Day (0-31)
  • 4: Month (0-12 [12 == December])
  • 5: Day of the week(0-7 [7 or 0 == sunday])
  • /path/to/command - Script or command name to schedule
Same above five fields structure can be easily remembered with following diagram: 
* * * * * command to be executed- - - - -| | | | || | | | ----- Day of week (0 - 7) (Sunday=0 or 7)| | | ------- Month (1 - 12)| | --------- Day of month (1 - 31)| ----------- Hour (0 - 23)------------- Minute (0 - 59)
Example(s)
If you wished to have a script named /root/backup.sh run every day at 3am, my crontab entry would look like as follows:
(a) Install your cronjob:# crontab -e(b)Append following entry:0 3 * * * /root/backup.shRun five minutes after midnight, every day:5 0 * * * /path/to/commandRun at 2:15pm on the first of every month:15 14 1 * * /path/to/commandRun at 10 pm on weekdays: 0 22 * * 1-5 /path/to/command Run 23 minutes after midnigbt, 2am, 4am ..., everyday:23 0-23/2 * * * /path/to/commandRun at 5 after 4 every sunday:5 4 * * sun /path/to/command
Use of operators

An operator allows you to specifying multiple values in a field. There are three operators:
  1. The asterisk (*) : This operator specifies all possible values for a field. For example, an asterisk in the hour time field would be equivalent to every hour or an asterisk in the month field would be equivalent to every month.
  2. The comma (,) : This operator specifies a list of values, for example: "1,5,10,15,20, 25".
  3. The dash (-) : This operator specifies a range of values, for example: "5-15" days , which is equivalent to typing "5,6,7,8,9,....,13,14,15" using the comma operator.
How do I disabling Email output?


By default the output of a command or a script (if any produced), will be email to your local email account. To stop receiving email output from crontab you need to append >/dev/null 2>&1. For example:0 3 * * * /root/backup.sh >/dev/null 2>&1To mail output to particluer email account let us say vivek@nixcraft.in you need to define MAILTO variable to your cron job:MAILTO="vivek@nixcraft.in"
0 3 * * * /root/backup.sh >/dev/null 2>&1
Task:To list your crontab jobs use the command

Type the following command:# crontab -lTo remove or erase all crontab jobs use the command:# crontab -r
Use special string to save time

Instead of the first five fields, you can use any one of eight special strings. It will not just save your time but it will improve readability.
Special stringMeaning@rebootRun once, at startup.@yearlyRun once a year, "0 0 1 1 *".@annually(same as @yearly)@monthlyRun once a month, "0 0 1 * *".@weeklyRun once a week, "0 0 * * 0".@dailyRun once a day, "0 0 * * *".@midnight(same as @daily)@hourlyRun once an hour, "0 * * * *".
Run ntpdate every hour:
@hourly /path/to/ntpdate
Make a backup everyday:
@daily /path/to/backup/script.sh
Understanding /etc/crontab file and /etc/cron.d/* directories

/etc/crontab is system crontabs file. Usually only used by root user or daemons to configure system wide jobs. All individual user must must use crontab command to install and edit their jobs as described above. /var/spool/cron/ or /var/cron/tabs/ is directory for personal user crontab files. It must be backup with users home directory.
Typical /etc/crontab file entries:
SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/# run-parts01 * * * * root run-parts /etc/cron.hourly02 4 * * * root run-parts /etc/cron.daily22 4 * * 0 root run-parts /etc/cron.weekly42 4 1 * * root run-parts /etc/cron.monthlyAdditionally, cron reads the files in /etc/cron.d/ directory. Usually system daemon such as sa-update or sysstat places their cronjob here. As a root user or superuser you can use following directories to configure cronjobs. You can directly drop your scripts here. run-parts command run scripts or programs in a directory via /etc/crontab
DirectoryDescription/etc/cron.d/ Put all scripts here and call them from /etc/crontab file. /etc/cron.daily/ Run all scripts once a day/etc/cron.hourly/ Run all scripts once an hour/etc/cron.monthly/ Run all scripts once a month/etc/cron.weekly/Run all scripts once a week
How do I use above directories to put scripts?

Here is a sample shell script (clean.cache) to clean up cached files every 10 days. This script is directly created at /etc/cron.daliy/ directory i.e. create a file called /etc/cron.daily/clean.cache: 
#!/bin/bashCROOT="/tmp/cachelighttpd/"DAYS=10LUSER="lighttpd"LGROUP="lighttpd" # start cleaning/usr/bin/find ${CROOT} -type f -mtime +${DAYS} | xargs -r /bin/rm if directory deleted by some other script just get it backif [ ! -d $CROOT ]then /bin/mkdir -p $CROOT /bin/chown ${LUSER}:${LGROUP} ${CROOT}fi
lệnh crontab -r sẽ rút tên file lịch mà bạn đã đăng ký trên hệ thống ra (không đăng ký lịch nữa).

Nguồn: https://www.diendanmaychu.vn

Comments

Popular Posts