Như trong phần 2 của serie này mình đã hướng dẫn, nếu khi backup chúng ta sẽ phải gõ thủ công như vậy, nên có thể nó hơi mất thời gian và bạn sẽ cần một giải pháp chuyên nghiệp hơn là làm thủ công.
Nếu bạn cần một giải pháp khác tốt hơn là gõ từng câu lệnh thủ công thì ở bài này mình sẽ hướng dẫn các bạn tự viết một Shell script để thực hiện công việc backup để khi nào cần backup, bạn chỉ cần gõ một câu lệnh nào đó mà bạn tự đặt ra thay vì sử dụng các lệnh thủ công.
Hơn nữa, cũng trong bài này mình sẽ hướng dẫn bạn cách đưa một Shell script bạn tự viết vào crontab để công việc backup diễn ra hoàn toàn tự động, như backup 1 ngày 1 lần chẳng hạn.
Nên xem trước: Học VPS căn bản
Shell Script là một ngôn ngữ lập trình kịch bản được thiết kế dành cho môi trường UNIX. Chẳng hạn bạn hay sử dụng các lệnh như cd, unzip,…tất cả lệnh đó đều là Shell script.
Chẳng hạn như bạn cần backup một thư mục nào đó và chuyển file backup đến một thư mục chỉ định, đồng thời xóa các file backup cũ thì nếu bạn tự gõ các lệnh đó thủ công thì bạn sẽ cần gõ khoảng 4, 5 lần. Tuy nhiên với ngôn ngữ Shell, bạn có thể lồng các tác vụ đó vào một file Shell script để khi cần làm việc kia thì bạn chỉ cần gõ một lệnh mà bạn đã đặt ra.
Ở trong bài này mình sẽ không thể hướng dẫn bạn hết các câu lệnh trong Shell script mà sẽ chỉ hướng dẫn bạn cách viết một script backup dữ liệu mà thôi, nhưng hy vọng là bạn có thể ứng dụng nó vào các việc khác tốt hơn. Khi nào có thời gian, mình sẽ làm một serie về Shell script.
Để viết một Shell script, bạn có thể viết thẳng trên VPS bằng bộ gõ vi trên máy chủ hoặc phần mềm Trelby vì các editor mặc định ở Windows khi save file lại sẽ không đúng định dạng của UNIX.
Trước khi lập trình thì dĩ nhiên ta phải nghĩ sẵn 1 kịch bản trong đầu. Để code trở nên dễ hiểu thì mình sẽ có một kịch bản như sau:
Gõ lệnh tên là tpbackup với cấu trúc sau để backup:
tpbackup [thư mục cần backup] [thư mục cần lưu]
Sau khi gõ xong, hệ thống sẽ hiển thị thông báo đang backup và xuất ra dữ liệu bao gồm đường dẫn lưu file backup và tên file backup.
Đầu tiên là bạn tạo ra một file với tên tpbackup trong thư mục /bin:
vi /bin/tpbackup
và bắt đầu viết các đoạn dưới đây:
#!/ bin/bash # Thiet lap bien (variables) can thiet backup_folder=$1 dest_folder=$2
Trong đó, dòng #! /bin/bash
nghĩa là giúp UNIX xác định code của bạn sẽ được chạy bằng chương trình nào, ở đây ta sẽ dùng bash.
Ở dưới mình có 2 biến là backup_folder
(thư mục cần backup) và dest_folder
(thư mục cần lưu file). Cả 2 biến này đều có giá trị là $1
và $2
, hai giá trị này nghĩa là tham số mà bạn sẽ truyền vào khi gõ lệnh. Ví dụ lệnh của mình là:
tpbackup /home /tmp cddos.net
Thì cái /home chính là tham số $1
và /tmp là tham số $2
. Sở dĩ chúng ta nên sử dụng tham số thay vì định nghĩa giá trị tĩnh là sau này nếu cần backup thư mục nào đó thì khỏi cần tạo một script mới.
Tiếp tục, chúng ta tạo thêm 2 biến nữa như sau:
# Thiet lap bien cua ten file backup ngay=$(date +%d-%m-%Y) ## Định hình cấu trúc ngày tháng kiểu DD-MM-YYYY (31/05/2014) file_name="backup-$ngay" # Tên file sẽ có dạng backup-31-05-2014
2 đoạn trên nghĩa là chúng ta khởi tạo cấu trúc tên file của backup để tránh bị trùng.
Tiếp tục viết đoạn sau:
# Quy trinh backup echo "Dang tien hanh backup du lieu tai $backup_folder va se duoc gui den $dest_folder" echo zip -r $dest_folder/$file_name $backup_folder > /dev/null # Hien thi thong bao sau khi backup xong echo echo "BACKUP THANH CONG!" echo "Ten file backup: $file_name" echo "File backup da duoc luu tai: $dest_folder" ls -al $dest_folder cd ~ echo
Đoạn trên nghĩa là nó sẽ in ra tin nhắn cho biết hệ thống đang tiến hành backup và hành động ở đây là lệnh zip. Sau khi lệnh zip chạy xong, nó sẽ tiếp tục chạy các đoạn echo ở dưới để hiển thị thông báo.
Cuối cùng là lưu file này lại và CHMOD cho nó:
chmod 755 /bin/tpbackup
Ok, bây giờ hãy thử gõ lệnh tpbackup kèm theo thư mục cần backup và thư mục cần lưu giống thế này:
tpbackup /home/webdata/cddos.net/public_html /home
Kết quả trả về:
[root@hocvps ~]# tpbackup /home/webdata/cddos.net/public_html/ /home Dang tien hanh backup du lieu tai /home/webdata/cddos.net/public_html/ va se duoc gui den /home BACKUP THANH CONG! Ten file backup: backup-24-09-2014 File backup da duoc luu tai: /home total 46584 drwxr-xr-x 3 root root
4096 Sep 24 14:57 . dr-xr-xr-x 22 root
root
4096 Sep 24 13:27 .. -rw-r–r– 1 root
root
47687224 Sep 24 14:57 backup-24-09-2014.zip drwxr-xr-x 3 apache apache
4096 Sep 24 07:08 webdata
Xong rồi đấy :D. Bây giờ nếu bạn cần backup thì cứ chạy lệnh tpbackup và gõ đường dẫn cần lưu và đường dẫn cần backup vào là xong.
Toàn bộ code của script:
#! /bin/sh # # Thiet lap bien (variables) can thiet backup_folder=$1 dest_folder=$2 # Thiet lap bien cua ten file backup ngay=$(date +%d-%m-%Y) ## Dinh hinh cau truc ngay thang kieu DD-MM-YYYY (31/05/2014) file_name="backup-$ngay" # Ten file se co dang backup-31-05-2014 # Quy trinh backup echo "Dang tien hanh backup du lieu tai $backup_folder va se duoc gui den $dest_folder" echo zip -r $dest_folder/$file_name cd $backup_folder > /dev/null # Hien thi thong bao sau khi backup xong echo echo "BACKUP THANH CONG!" echo "Ten file backup: $file_name" ; echo "File backup da duoc luu tai: $dest_folder" ls -al $dest_folder cd ~ echo
Nếu bạn cảm thấy hứng thú với Shell script thì có thể tự học tại Linux Shell Script Tutorial.
Cron Job nghĩa là khái niệm chỉ một hành động nào đó được lặp đi lặp lại theo một chu kỳ nhất định. Ở bài này mình sẽ không giải thích rõ Cron Job là gì nên mình chỉ nói về việc sử dụng Cron Job để máy chủ tự động backup theo chu kỳ nhất định.
Lưu ý: Nên sử dụng tài khoản root để tạo cron.
Để tạo Cron Job, bạn hãy gõ lệnh sau:
crontab -e
Ấn phím i
để chuyển qua chế độ Insert và gõ:
* 15 * * * zip -r /home/cddos.net.zip /home/webdata/cddos.net/public_html/
Mình có mô hình giải thích như sau:
* 15 * * * zip -r /home/cddos.net.zip /home/webdata/cddos.net/public_html/ # # # # # ######################################## | | | | | ---------------------------------- Lệnh sẽ chạy khi cron job kích hoạt | | | | ----------Ngày trong tuần (0-7) | | | ------------ Tháng (1-12) | | ---------------Ngày trong tháng (1-31) | ----------------- Giờ (1-24) ------------------- Phút (1-59)
Như vậy, đoạn ở trên nghĩa là nó sẽ chạy đoạn lệnh tpbackup sau giờ thứ 15 (3h chiều) mỗi ngày.
Gõ xong ấn phím ESC và gõ :wq!
để lưu lại và thoát ra.
Để kiểm tra xem bạn đã thêm cronjob thành công hay chưa, hãy gõ lệnh xem nội dung của file /var/spool/cron/root:
cat /var/spool/cron/root
Nếu nó hiện ra cái cronjob mà bạn vừa thêm thì thành công.
[root@hocvps log]# cat /var/spool/cron/root 00 15 * * * zip -r /home/cddos.net.zip /home/webdata/cddos.net/public_html/
Để kiểm tra xem cron có chạy hay không, bạn cứ thay 00 15 * * *
thành */
nghĩa là một phút nó chạy một lần. Sau đó chạy lệnh tail -f /var/log/cron để xem
1 ** * * *cronjob
rồi đợi một phút xem nó có chạy hay không.
Sep 24 15:48:01 hocvps CROND[3253]: (root) CMD (zip -r /home/cddos.net.zip /home/webdata/cddos.net/public_html/)
Bạn có thể tùy biến thêm cái này nhé. ?
Tips: Bạn có thể sử dụng công cụ Crontab Code Generator để hỗ trợ tạo crontab nhanh và chính xác.
Ở bài này tuy là mình tập trung vào phần backup dữ liệu nhưng cũng có pha thêm một chút về Shell scripting vì biết đâu được bạn sẽ hứng thú với nó. ?
Tuy vậy, việc này vẫn còn khá thủ công vì bạn cũng cần phải làm nhiều bước. VẬy thì hãy đọc tiếp phần tiếp để có giải pháp tối ưu nhất.