Tuesday, September 17, 2013

Crontab trên Linux

1. Cron là gì?

Cron là một tiện ích cho phép thực hiện các tác vụ trên hệ thống một cách tự động theo định kỳ, ở chế độ nền của hệ thống. Chức năng này khá phong phú cho phép thiết lập tác vụ dưới dạng command đơn hoặc dùng script theo thời gian định ký được thiết lập sẵn. Tiện ích này trong nhiều trường hợp tỏ ra khá hữu dụng với người dùng và người quản trị. Đơn cử như vấn đề backup Mysql một cách tự động hàng ngày vào một thư mục cố định mà chúng ta quy định chẳng hạn.
Phân loại Cron ?
Có tất cả là hai dạng được sử dụng trong cấu hình Cron:
1. Crontab cho hệ thống Linux/Unix: Thông thường được sử dụng bởi các dịch vụ hệ thống hoặc các công việc quan trong đòi hỏi các đặc quyền cấp cao như root. Đặc biệt còn có thể quy định tác vụ sẽ được thực thi dưới  danh nghĩa của một người dùng xác định trong hệ thống.
2. Crontab cho người dùng hệ thống: Tất cả người dùng trong hệ thống đều có quyền tạo ra các tác vụ định kỳ cho bản thân người dùng đó. Và mặc định các tác vụ do người dùng tạo ra sẽ hoạt động dưới danh nghĩa người dùng đó và không thể thay đổi.

2. Cron làm việc thế nào?

Một cron schedule đơn giản là một tập tin ASCII. Mỗi người dùng có một Cron riêng, thông thường nằm ở /var/spool/cron . Các Cron không cho phép người dùng tạo hoặc chỉnh sửa trực tiếp với bất kỳ trình biên tập tập tin nào, trừ phi họ 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
3. Cấu trúc của crontab
Một crontab file có 6 phân đoạn trong đó 5 phân đoạn đầu xác định thời gian, và đoạn cuối cùng là lệnh sẽ được chạy định kỳ mà chúng ta mong muốn. Mỗi phân đoạn của cú pháp crontab cách nhau bằng một dấu khoảng trắng nhưng đoạn cuối cùng có thể tồn tại trong nó nhiều khoảng trắng và điều chú ý là thời gian tham chiếu là từ máy local.
Một chú ý nhỏ là nếu một máy tính đang chạy Crontab gặp sự cố thì hiển nhiên tiến trình được lập lịch trong thời điểm xảy ra sự cố sẽ không hoạt động. Và ngay cả khi máy tính hoạt động lại bình thường thì tiến trình bị bỏ lỡ đó cũng không tự động thực hiện mà chỉ có thể đợi chu kỳ kế tiếp.
Chúng ta có cấu trúc lệnh như sau:
image
Nếu một cột được gán ký tự *, tương ứng là tác vụ sẽ được chạy ở mọi giá trị cho cột đó. Ngoài ra còn một ký tự đặc biệt được sử dụng trong cú pháp lệnh là dấu “,” dấu này dùng để xác định tứng giá trị riêng lẻ trong một đoạn
Ví dụ như chúng ta muốn lập lịch chi tiết là phut thứ 5 và 35 của mỗi giờ mỗi ngày mỗi tháng và mỗi ngày trong tuần sẽ làm tác vụ <A>
5,35 * * * * tác vụ <A>
Ngoài ra còn một ký tự khác là dấu “-“ đại diện cho một dãy giá trị thay vì dấu “,” là một giá trị tách rời.
Đặc biệt để hỗ trợ đơn giản trong cấu hình cron người ta còn kiến tạo ra 8 chuỗi ký tự đặc biệt có ý nghĩa xác định như sau:
Chuỗi đặc biệtý nghĩa
@rebootchạy một lần khi khởi động
@yearlychạy một lần trong năm “0 0 1 1”
@annuallygiống @yearly
@monthlychạy một lần trong tháng “0 0 * * 0”
@weeklychạy một lần trong tuần “0 0 * * 0”
@dailychạy một lần trong ngày “0 0 * * *”
@midnightgiống daily
@hourlychạy một lần trong giờ “0 * * * *”
ví dụ:
Chạy ntpdate mỗi giờ: @hourly /path/to/ntpdate
Chạy backup script mỗi ngày: @daily /path/to/backup/script.sh
Tính năng email
Mặc định khi tới định kỳ kích hoạt một tác vụ thì nội dung out put của tác vụ đó mặc định sẽ được gửi vào mail cho tài khoản email local của người dùng. Đê ngừng nhận các thông tin đó qua email chúng ta cần thêm vào sau thiết lập tác vụ đó cú pháp >/dev/null 2>&1
vi dụ: 0 3 * * * /root/backup.sh >/dev/null 2>&1
Thay vào đó để thiết lập cụ thể lại tính năng mail sẽ gửi mail cho một tài khoản mail xác định chúng ta cần thiết lập một biến MAILTO như sau trong khi thiết lập cron:
Ví dụ:
MAILTO=”vivek@nixcraft.in”
0 3 * * * /root/backup.sh >/dev/null 2>&1

4. Các ví dụ cụ thể
Giả sử tôi viết một đoạn script backup bookmarks trong Firefox như sau:
Code:
#!/bin/bash
date=`date +%F`
cp ~/.mozilla/firefox/13kee53o.default/bookmarks.html /mnt/data/BACKUP/bookmarks-$date.html
sau đó tôi 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
0 15 * * 1,4 sh /mnt/data/linux/code/backupbookmarks.sh
Cuối cùng, nhớ khởi động lại cron daemon:
/etc/init.d/crond restart
Chú ý: Để muốn “test” ngay xem crontab nó có hoạt động không, bạn có thể sửa lại đoạn script trên một chút:
#!/bin/bash
date=`date +%F-%H-%M-%S`
cp ~/.mozilla/firefox/13kee53o.default/bookmarks.html /mnt/data/BACKUP/bookmarks-$date.html
và file crontab bạn sẽ cho backup liên tục theo từng phút như sau:
0-59 * * * * sh /mnt/data/linux/code/backupbookmarks.sh
Bạn có thể chỉnh sửa file crontab trong Linux luôn bằng cách xài Software GNU Midnight Commander.
Ngoài ra bạn cũng có thể tạo File crontab (không có đuôi) trên máy Windows (cách này thường dùng trong trường hợp máy chủ là Linux máy con là Windows) bằng chương trình NOTEPAD rồi dùng Software WinSCP chuyển qua máy Linux.
Lưu ý sau khi chuyển qua máy Linux phải chạy lênh “dos2unix ‘pathfile’” để chuyển sang loại file Linux đọc được.
  • Thực hiện nhiều nhiệm vụ
Nếu như ta thực hiện cùng lúc 1 gói các lệnh thì ta nên tạo ra một shell file_crontab.sh để thực hiện cùng nhiều lệnh (tương đương với file.bat trong windows)
Ví dụ:
Bước 1: Ta tiến hành tạo một file file_crontab.sh có nội dung như sau bằng lệnh vi (vim)
mkdir -p/root/test
cp/tmb/* /root/test
cd/root/test
taz -cvf test.tar/root/test/*
cp/root/test/test.tar/home/someuser/tmp
Bước 2: Tiến hành thiết lập cấu hình cho file crontab the trình tự các bước ở phần trên rồi khởi động lại.
- Thêm dòng này vào file crontab
00 20 * * * root sh/path/file_crontab.sh
- Restart lại dịch vụ crontab
Một số lưu ý
- Khi thực hiện khai báo lệnh này ta lên chú ý về thời gian thực hiện, tránh thực hiện những lệnh backup dữ liệu hay restart lại service trong thời gian nhạy cảm của hệ thống (thời gian có nhiều tiến trình đang hoạt động, có nhiều kết nối từ bên ngoài vào).
Một số ví dụ về crontab nâng cao
0 0 * * * – chạy script mỗi 0:00 AM
0 * * * * – chạy script mỗi giờ (vào phút đầu tiên của giờ)
*/15 * * * * – chạy script mỗi 15 ph
5 8 * * * – chạy script mỗi ngày vào 8h5ph sáng
5 8 15 * * – chạy script mỗi 8h5ph sang ngày 15 hằng tháng
5 8 * * 1 – chạy script mỗi thứ hai hàng tuần, 8h5ph
30 0 1 1,6,12 * chạy script vào 0h30ph sang ngày 1 của tháng 1, tháng 6 và tháng 12.
0 20 * 10 1-5 8h tối mỗi ngày trong tuần(thứ 2 tới thứ 6) của tháng 10
0 0 1,10,15 * * nửa đêm của ngày 1, 10 và 15 hằng tháng.
5,10 0 10 * 1 vào 12h5, 12h10 mỗi thứ hai và vào ngày 10 hằng tháng
1,21,41 * * * * echo “Meu crontab rodou mesmo!”