Lập trình, Linux

Tự động hóa Linux: Viết Shell Script, Lập lịch Cron và CI/CD Pipeline

Giới thiệu

Bạn đã bao giờ mệt mỏi khi cứ phải phải lặp đi lặp lại cùng một tác vụ trên Linux? Ví dụ như nhập tên vào rồi nhìn Linux Server in ra lời chào mỗi lần chạy chương trình. Rất may, Linux cho phép chúng ta tự động hóa những việc như vậy bằng shell script và cron. Trong bài viết này, chúng ta sẽ cùng học cách: tạo một script đơn giản greet.sh để chào tên người dùng, dùng cron để chạy tự động script đó theo lịch, và cuối cùng xây dựng một pipeline CI/CD đơn giản bằng cron để tự động backup hay copy dữ liệu giữa hai thư mục “remote” và “local”. Bài viết được viết theo phong cách thân thiện, súc tích như The Linux Command Line, giúp người mới dùng Linux có thể hiểu từ cơ bản nhất.

Hãy bắt đầu với việc viết một shell script chào hỏi đơn giản.

Tạo script chào hỏi greet.sh

Shell script là một file văn bản chứa các lệnh Linux. Chúng ta sẽ tạo một file tên greet.sh để nhập tên và in lời chào. Đây là cấu trúc cơ bản của một shell script:

#!/bin/bash           
# Đầu script, dòng này gọi Bash
echo "What is your name:"   # In lời nhắc nhập tên
read name                # Đọc tên người dùng vào biến $name
echo "Hello, $name!"  # In lời chào cùng với tên
  • Dòng đầu #!/bin/bash gọi shell Bash để chạy script.

  • Lệnh echo in một dòng thông báo ra màn hình. Trong ví dụ trên, chúng  ta dùng echo "What is your name:" để nhắc nhập tên.

  • Lệnh read name đợi người dùng nhập và lưu dữ liệu vào biến name.

  • Sau đó echo "Xin chào, $name!" hiển thị lời chào cùng với tên người dùng.

Ví dụ, bạn lưu nội dung trên vào file greet.sh, sau đó chạy:

chmod +x greet.sh      # Cho phép file có thể thực thi
./greet.sh             # Chạy script

Bạn sẽ thấy màn hình hiện “What is your name:”. Gõ tên vào, script sẽ đọc và in Hello, [Name]. Đây là ví dụ cơ bản về shell script tương tác. Bạn có thể mở rộng script này thêm nhiều tính năng (ví dụ kiểm tra điều kiện, vòng lặp) khi đã quen với cú pháp Bash. Hãy tham khảo bài viết này của mình để hiểu về: Hướng dẫn làm thế nào để viết Bash Scripting trong Linux – Luu Ho Phuong Blog

Lập lịch công việc định kỳ với Cron

Khi bạn muốn chạy script tự động theo thời gian định kỳ (hàng ngày, hàng giờ, v.v.), hãy dùng Cron. Cron là một tiện ích Linux cho phép lập lịch tự động chạy các lệnh hoặc script theo định kỳ. Mỗi người dùng có một bảng Crontab riêng để định nghĩa các tác vụ định kỳ. Một mục Crontab bao gồm 5 trường thời gian và lệnh sẽ chạy, ví dụ như:

*  *  *  *  * /home/user/script.sh
│ │ │ │ │
│ │ │ │ └─ Thứ trong tuần (0-6; Chủ nhật=0)
│ │ │ └── Tháng (1-12)
│ │ └─── Ngày trong tháng (1-31)
│ └──── Giờ (0-23)
└───── Phút (0-59)

Ký tự * nghĩa là “mọi giá trị”. Ví dụ: biểu thức 0 23 * * * có nghĩa “ chạy lệnh vào lúc 23:00 mỗi ngày”. Bảng Crontab cho phép linh hoạt với các phạm vi và bước nhảy, nhưng nói chung mỗi cột là phút, giờ, ngày, tháng, thứ.

Để chỉnh sửa crontab của người dùng hiện tại, dùng lệnh:

crontab -e # Mở trình soạn thảo để chỉnh sửa crontab

Trong trình soạn thảo, bạn có thể thêm các dòng nhiệm vụ. Ví dụ, sau khi lưu file, bạn kiểm tra nội dung với crontab -l và có thể thấy những dòng định nghĩa như sau:

0 23 * * * /home/user/backup.sh

(có nghĩa là chạy /home/user/backup.sh vào 23:00 mỗi ngày).

Theo Red Hat, nếu muốn backup thư mục, ta có thể thêm dòng crontab kiểu:

0 23 * * * localuser rsync -av /home/localuser/source /home/localuser/destination

Dòng này sẽ chạy lệnh rsync để copy từ source sang destination lúc 23:00 hàng ngày. Hoặc:

0 12 * * 6 localuser cp -R /home/localuser/destination/* /home/localuser/full/

sẽ chạy lệnh copy lúc 12:00 ngày thứ Bảy (6) mỗi tuần. Những ví dụ này minh họa cách ghi lịch, với 5 trường thời gian đầu là phút giờ ngày-tháng thứ-trong-tuần, và có thể chỉ định user nếu bạn đang sửa crontab hệ thống. Để hiểu về cách dùng lệnh rsync cho việc backup dữ liệu, bạn hãy tham khảo bài viết này của mình:  Backup và Khôi Phục Dữ Liệu Trong Linux Server Với Rsync Và Tar – Luu Ho Phuong Blog

Ví dụ lập lịch backup dữ liệu đơn giản: Giả sử bạn muốn script greet.sh chạy mỗi ngày vào lúc 8 giờ sáng. Sau khi chmod +x greet.sh, mở crontab với crontab -e và thêm dòng sau:

0 8 * * * /home/username/greet.sh

Điều này sẽ tự động chạy script greet.sh vào 8:00 mỗi ngày, và mỗi lần sẽ in lời chào ra terminal (hoặc email nếu có). Bạn chỉ cần lưu và thoát, Cron sẽ tự động kích hoạt nhiệm vụ này. Để đảm bảo Cron đang chạy, bạn có thể kiểm tra dịch vụ cron (trên Ubuntu: sudo systemctl status cron). Theo Cronitor, cron là một chương trình Linux được chạy nền để tìm các mục trong crontab và thực thi chúng đúng lịch.

Xây dựng CI/CD Pipeline đơn giản bằng Cron

CI/CD (Continuous Integration/Continuous Deployment) là quy trình tự động hóa để lần lượt xây dựng, kiểm thử và triển khai phần mềm. Trong trường hợp đơn giản này, chúng ta sẽ mô phỏng một pipeline tự động: cứ định kỳ, cron sẽ chạy script để backup hay copy dữ liệu mới từ thư mục “remote” về “local” – tương tự như giai đoạn “deploy” đơn giản. Đây không phải pipeline chuyên nghiệp nhưng giúp bạn có thể hiểu ý tưởng CI/CD tự động trên Linux.

Chuẩn bị thư mục “remote” và “local”

Đầu tiên, tạo hai thư mục để mô phỏng nguồn và đích (ví dụ thư mục /home/user/remote/home/user/local), chạy các lệnh sau:

mkdir -p ~/remote
mkdir -p ~/local

Giả sử chúng ta có các files hoặc dữ liệu mới trong thư mục ~/remote .Ví dụ bạn tạo một số files trong thư mục này, sử dụng lần lượt các lệnh sau để tạo các files rỗng cho việc giả lập:

cd ~/remote
touch index.html styles.css banner.jpg

Mục tiêu: hàng ngày Cron sẽ chạy một script để copy toàn bộ nội dung từ ~/remote sang ~/local. Nếu thư mục “remote” thật sự ở máy khác, chúng ta  có thể dùng lệnh scp (Secure Copy) để truyền files: ví dụ:

scp /path/to/file user@remote_host:/remote/path/

Như vậy lệnh này: scp file.txt user@10.10.0.2:/remote/directory  để copy files đến một Linux backup server từ xa có IP là 10.0.10.2. Tuy nhiên ở đây ta chỉ giả lập trên cùng một Linux server, nên có thể dùng cp hoặc rsync. Lệnh rsync hay cp cũng được dùng trong crontab để backup dữ liệu.

Viết script CI/CD copy dữ liệu

Tạo file script, ví dụ pipeline.sh, nội dung như sau:

#!/bin/bash
# Tự động sao chép dữ liệu từ thư mục remote sang local
REMOTE="$HOME/remote"
LOCAL="$HOME/local"
cp -r $REMOTE/* $LOCAL/
echo "$(date): Đã sao chép dữ liệu từ remote sang local." >> ~/pipeline.log

Giải thích:

  • cp -r $REMOTE/* $LOCAL/ sao chép đệ quy toàn bộ các files từ ~/remote sang ~/local. Bạn cũng có thể dùng lệnh: rsync -av $REMOTE/ $LOCAL/ để backup hay copy chi tiết và đồng bộ dữ liệu giữa hai thư mục này tốt hơn.

  • Dòng echo lưu nhật ký vào file pipeline.log để theo dõi. Mỗi lần chạy script sẽ ghi thời gian và thông báo thành công.

Nhớ cho script có quyền thực thi với lệnh:

chmod +x pipeline.sh

Lập lịch Cron cho CI/CD Pipeline

Bây giờ chúng ta đặt lịch chạy pipeline.sh tự động hàng ngày. Mở crontab (crontab -e) và thêm dòng, ví dụ:

30 7 * * * /bin/bash $HOME/pipeline.sh

Câu lệnh trên sẽ chạy pipeline.sh vào 7:30 mỗi sáng. Bạn có thể điều chỉnh tùy ý (ví dụ 0 2 * * * để chạy lúc 2h sáng mỗi ngày) như vậy khi cron chạy, script sẽ copy dữ liệu và ghi log.

Lưu ý: Nếu bạn dùng đường dẫn tới script thì nên dùng đường dẫn tuyệt đối (như ví dụ trên) và gọi kèm shell (/bin/bash). Đảm bảo rằng Cron có quyền đọc thư mục và ghi file. Bạn có thể thử chạy thử script ngoài cron trước để kiểm tra có lỗi hay không. Nếu dùng scp giữa hai servers, bạn cần thiết lập SSH key không cần mật khẩu để cron có thể chạy tự động không cần phải can thiệp bằng tay.

Kiểm tra và xác minh pipeline

Sau khi thiết lập, hãy kiểm tra xem cron có thực sự chạy hay không. Bạn có thể sửa khung thời gian cron vào 2 phút tới và quan sát kết quả. Ví dụ, nếu bây giờ là 15:00, đặt:

*/2 * * * * /bin/bash $HOME/pipeline.sh

Lệnh trên chạy mỗi 2 phút. Sau 2-4 phút, hãy kiểm tra file ~/pipeline.log để xem script có ghi nhận chạy chưa. Đồng thời kiểm tra thư mục  ls ~/local đã có files từ ~/remote chưa. Bạn có thể test thử tiếp và chờ xem lệnh trên có chạy tiếp sau 2 phút nữa hay không, bằng cách chạy lệnh sau để tạo tiếp các files rỗng trong thư mục  ~/remote:

touch about.html contact.html faq.html

Ngoài ra, Cron sẽ ghi nhật ký trong /var/log/syslog (Ubuntu) hoặc /var/log/cron (CentOS); bạn có thể grep “cron” để kiểm tra thông tin.

Nếu mọi thứ hoạt động, bạn đã có một pipeline tự động: Cron sẽ chạy script, script xử lý công việc (ở đây là copy file), và bạn có thể thêm bước xác nhận (như gửi email, chạy kiểm thử, v.v.) tùy ý. Như GitLab định nghĩa, CI/CD pipeline là một quy trình tự động đưa code từ giai đoạn nguồn tới biên dịch, kiểm thử và phát hành. Ở đây, chúng ta đang mô phỏng phần đơn giản nhất của pipeline tự động (copy và deploy tài nguyên) trên Linux.

Kiểm tra pipeline.log để xem script có đúng là đã chạy chưa:

Kết luận và khuyến khích

Qua bài viết này, bạn đã học cách tạo một shell script đơn giản (greet.sh) để nhập tên và chào người dùng, cách sử dụng Cron để lập lịch chạy script tự động, và cách dựng một pipeline CI/CD rất cơ bản bằng cron job để sao chép dữ liệu giữa hai thư mục. Những kiến thức này là nền tảng hữu ích cho tự động hóa (automation) trên Linux.

Hãy thử áp dụng: ví dụ bạn có thể mở rộng pipeline với việc clone repository Git, chạy build/test, rồi deploy tự động bằng cron như hướng dẫn này của tôi. Đừng ngại sửa lại cron để chạy nhanh hơn khi test (như cron chạy mỗi phút) và sau đó điều chỉnh về định kỳ thực tế. Cron rất mạnh mẽ và tiện dụng khi bạn chỉ cần một giải pháp nhẹ nhàng để tự động hóa công việc hàng ngày trên Linux.

Nếu bạn thấy bài viết hữu ích, hãy chia sẻ cho bạn bè và đồng nghiệp của bạn để cùng nhau học hỏi nhiều hơn! Và đừng quên khám phá thêm các lệnh, công cụ Linux khác để tăng cường khả năng DevOps của mình. Chúc bạn thành công và tự động hóa hiệu quả!

#Linux #CronJob #ShellScript #DevOps #CI_CD #tự_động_hóa

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *