Viết một bash-script đơn giản để tự động hóa các nhiệm vụ bằng cách sử dụng cron
1. Xác định nhiệm vụ
Hôm nay, chúng ta sẽ viết một script thực tế, kiểm tra tính khả dụng của website và ghi kết quả vào một file log, sau đó tự động hóa việc chạy nó bằng cron
.
Chúng ta muốn làm gì?
Chúng ta sẽ tạo một bash script mà:
- Kiểm tra tính khả dụng của website chỉ định bằng
ping
. - Ghi kết quả kiểm tra vào file nhật ký, bao gồm thời gian và ngày tháng.
- Chạy script này tự động mỗi 5 phút với
cron
.
Tại sao điều này quan trọng?
Trong thế giới thực, việc giám sát tính khả dụng của website và server là một trong những nhiệm vụ quan trọng nhất của quản trị hệ thống. Ví dụ, nếu website (hoặc server) của bạn đột nhiên không phản hồi, bạn muốn biết về việc này càng sớm càng tốt. Kịch bản này hữu ích không chỉ để giám sát mà còn trong phỏng vấn hoặc thực hành công việc.
2. Bước 1: Viết bash-script đơn giản
Bắt đầu bằng việc viết bash-script cơ bản. Đây là giải thích từng bước về những gì script này sẽ làm:
- Chúng ta sẽ chỉ định địa chỉ website cần kiểm tra.
- Sử dụng
ping
để thử gửi request đến server. - Kiểm tra xem có nhận được phản hồi hay không.
- Lưu kết quả vào file log.
Hãy tạo file site_check.sh
:
#!/bin/bash
# Xác định địa chỉ website
WEBSITE="example.com"
# File để ghi log kết quả
LOG_FILE="/var/log/site_status.log"
# Kiểm tra trạng thái website bằng cách sử dụng ping
if ping -c 1 $WEBSITE &> /dev/null; then
# Nếu website khả dụng
echo "$(date): $WEBSITE có thể truy cập" >> $LOG_FILE
else
# Nếu website không khả dụng
echo "$(date): $WEBSITE không thể truy cập" >> $LOG_FILE
fi
Giải thích mã:
#!/bin/bash
— chỉ định rằng script này sẽ được thực thi bằng Bash.WEBSITE="example.com"
— địa chỉ website cần kiểm tra. Bạn có thể thayexample.com
bằng bất kỳ website hoặc server nào mà bạn muốn theo dõi.ping -c 1 $WEBSITE
— gửi một gói tin (-c 1
) đến website chỉ định. Nếu website phản hồi, command sẽ hoàn thành với mã 0. Nếu không thì sẽ báo lỗi.&> /dev/null
— chuyển hướng output tiêu chuẩn và lỗi vào "hố đen" (chúng ta không muốn thấy output củaping
trong terminal).$(date)
— thêm ngày và giờ hiện tại vào thông báo.>> $LOG_FILE
— ghi thêm kết quả vào cuối file log.
3. Bước 2: Chạy script thủ công
Trước khi tự động hóa việc chạy script, hãy đảm bảo rằng nó hoạt động.
Lưu script vào file
site_check.sh
.Đặt quyền thực thi cho nó:
chmod +x site_check.sh
Chạy script:
sudo ./site_check.sh
Sau khi thực thi script, mở file /var/log/site_status.log
để đảm bảo rằng kết quả kiểm tra đã được thêm vào log. Sử dụng lệnh:
cat /var/log/site_status.log
Nếu mọi thứ hoạt động, bạn sẽ thấy dòng như sau:
Mon Oct 30 14:35:22 UTC 2023: example.com is reachable
4. Bước 3: Cài đặt thực thi tự động bằng cron
Chúng ta đã biết rằng cron
cho phép chạy các nhiệm vụ theo lịch trình. Giờ chúng ta sẽ cài đặt cron
để script của chúng ta chạy mỗi 5 phút.
Chỉnh sửa crontab
Mở trình chỉnh sửa crontab
:
crontab -e
Thêm dòng sau:
*/5 * * * * /path/to/site_check.sh
Giải thích:
*/5
— chỉ ra rằng nhiệm vụ phải chạy mỗi 5 phút./path/to/site_check.sh
— đường dẫn đầy đủ đến script của chúng ta. Đảm bảo rằng nó đúng. Ví dụ, nếu script nằm trong thư mục chính của user, đường dẫn sẽ là gì đó như/home/your_username/site_check.sh
.
Sau khi lưu lại thay đổi, cron
sẽ bắt đầu chạy script mỗi 5 phút. Để kiểm tra xem nhiệm vụ đã được thêm vào chưa, thực hiện lệnh:
crontab -l
5. Bước 4: Kiểm tra hoạt động của cron
Bây giờ kiểm tra xem tự động hóa có hoạt động không nhé. Chờ 5-10 phút và mở lại file log:
cat /var/log/site_status.log
Bạn nên thấy các bản ghi mới được cập nhật mỗi 5 phút. Ví dụ:
Mon Oct 30 14:35:22 UTC 2023: example.com có thể truy cập được
Mon Oct 30 14:40:22 UTC 2023: example.com có thể truy cập được
Mon Oct 30 14:45:22 UTC 2023: example.com có thể truy cập được
6. Phân tích các câu hỏi và lỗi phổ biến
Ping trả về lỗi 'Permission denied'
Nếu bạn chạy script dưới quyền người dùng thông thường, có thể quyền của bạn không đủ. Chạy script với
sudo
hoặc cấp quyền thực thi.File log không được tạo
Hãy đảm bảo rằng đường dẫn đến file log (
/var/log/site_status.log
) được chỉ định đúng và người dùng của bạn có quyền ghi vào thư mục này. Nếu file không tồn tại, hãy tạo nó bằng cách sử dụng:sudo touch /var/log/site_status.log sudo chmod 666 /var/log/site_status.log
cron
không chạy scriptKiểm tra xem dịch vụ
cron
có đang hoạt động không:sudo systemctl status cron
Nó phải ở trạng thái
active (running)
. Nếu nó bị dừng, hãy khởi động lại:sudo systemctl start cron
Script không chạy với cron nhưng chạy thủ công thì được
Hãy đảm bảo rằng đường dẫn đến script và tất cả các file sử dụng được ghi đầy đủ. Trong các task của
cron
, các biến môi trường (ví dụ,$PATH
) có thể khác. Tốt nhất là sử dụng đường dẫn tuyệt đối.
7. Cải tiến và nhiệm vụ bổ sung
Lọc các website
Mở rộng script để kiểm tra trạng thái của nhiều website. Ví dụ:
WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
if ping -c 1 $SITE &> /dev/null; then
echo "$(date): $SITE is reachable" >> $LOG_FILE
else
echo "$(date): $SITE is unreachable" >> $LOG_FILE
fi
done
Gửi thông báo
Bổ sung thêm tính năng gửi thông báo nếu website không khả dụng. Ví dụ, sử dụng lệnh mail
để gửi email:
# Thông báo qua email
if ! ping -c 1 $WEBSITE &> /dev/null; then
echo "$WEBSITE is down!" | mail -s "Website Check Alert" your_email@example.com
fi
Ghi nhật ký theo chu kỳ
Giới hạn kích thước file log tới, ví dụ, 1 MB. Nếu file quá lớn, đổi tên (như lưu trữ) và bắt đầu một file log mới.
Chúc mừng! Bây giờ bạn đã biết cách sử dụng script bash và cron
để tự động hóa các nhiệm vụ thực tế. Kỹ năng này đặc biệt hữu ích đối với các DevOps-engineer và quản trị hệ thống.
GO TO FULL VERSION