🔄 Tóm tắt bài học: Trong bài học trước, bạn đã tự động hóa email và thông báo — gửi báo cáo và cảnh báo từ các script của mình. Bây giờ, hãy làm cho các script của bạn chạy tự động theo lịch trình và xử lý lỗi một cách trơn tru.
Một script hoạt động khi bạn chạy thủ công là một công cụ. Một script chạy theo lịch trình, xử lý lỗi và thông báo cho bạn về các sự cố là một hệ thống tự động hóa. Bài học này sẽ thu hẹp khoảng cách đó.
Các tùy chọn lập lịch
Công cụ
Nền tảng
Tốt nhất cho
cron
macOS/Linux
Đơn giản, đáng tin cậy, tích hợp sẵn
Task Scheduler
Windows
Lập lịch gốc của Windows
schedule (thư viện Python)
Tất cả các nền tảng
Lịch trình dễ đọc trong code Python
APScheduler
Tất cả các nền tảng
Lập lịch nâng cao với khả năng lưu trữ
launchd
macOS
Dành riêng cho macOS, nhiều tính năng hơn cron
Tùy chọn 1: cron (macOS/Linux)
Prompt AI:
Tạo biểu thức cron cho các lịch trình sau: (1) Mỗi ngày trong tuần lúc 8 giờ sáng, (2) Mỗi thứ Hai lúc 9 giờ sáng, (3) Mỗi 6 giờ, (4) Ngày đầu tiên của mỗi tháng lúc nửa đêm. Hiển thị cho tôi toàn bộ mục nhập crontab để chạy một script Python theo từng lịch trình, bao gồm đường dẫn đầy đủ đến python3 và script, và chuyển hướng đầu ra đến một file nhật ký.
Các mẫu cron phổ biến:
Lích trình
Biểu thức Cron
Mỗi ngày vào lúc 8 giờ sáng
0 8 * * *
Các ngày trong tuần lúc 8 giờ sáng
0 8 * * 1-5
Mỗi thứ Hai lúc 9 giờ sáng
0 9 * * 1
Cứ sau 6 giờ
0 */6 * * *
Đêm đầu tháng
0 0 1 * *
Mục nhập Crontab:
📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.
📋 Cách sao chép prompt này: Nhấp vào bất kỳ đâu bên trong khối màu xám, nhấn Cmd+A rồi Cmd+C (Mac) hoặc Ctrl+A rồi Ctrl+C (Windows). Hoặc sử dụng biểu tượng sao chép xuất hiện.
Tùy chọn 2: Thư viện lập lịch Python
✏️ Cách điền thông tin chi tiết của bạn: Thay thế mỗi dấu ngoặc vuông [] và trình giữ chỗ trong ngoặc bằng các thông tin cụ thể từ tình huống thực tế của bạn. Thông tin đầu vào mơ hồ sẽ tạo ra kết quả mơ hồ — hãy cụ thể.
👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.
📌 Những việc cần làm với kết quả: Lưu phản hồi vào file Notes Chọn gợi ý có tác động cao nhất và thực hiện nó trong tuần này — đừng cố gắng làm tất cả cùng một lúc.
⚠️ Nếu kết quả không ổn: Nếu các gợi ý có vẻ chung chung, hãy dán nội dung sau: "Hãy cụ thể hơn với ngữ cảnh thực tế của tôi. Bỏ qua lời khuyên chung chung." Nếu nó bỏ qua các chi tiết quan trọng bạn đã cung cấp, hãy hỏi: "Bạn đã bỏ sót [X] trong ngữ cảnh của tôi — hãy thực hiện lại với điều đó làm ràng buộc chính."
bash
pip install schedule
Prompt AI:
Viết một script lập lịch bằng Python sử dụng thư viện schedule sao cho: (1) Chạy daily_report() mỗi ngày trong tuần lúc 8 giờ sáng, (2) Chạy weekly_summary() mỗi thứ Sáu lúc 5 giờ chiều, (3) Chạy price_check() mỗi 6 giờ, (4) Ghi nhật ký thời gian bắt đầu và kết thúc của mỗi tác vụ, (5) Bắt và ghi nhật ký lỗi mà không làm sập trình lập lịch, (6) Gửi cảnh báo nếu bất kỳ tác vụ nào thất bại. Giữ cho trình lập lịch chạy vô thời hạn.
Xử lý lỗi sẵn sàng cho sản xuất
Thứ tự ưu tiên xử lý lỗi:
Cấp độ
Xử lý
Ví dụ
Thử/ngoại trừ mỗi thao tác
Thất bại cá nhân
Một file bị lỗi, các filekhác tiếp tục hoạt động
Thử lại với chế độ backoff
Lỗi tạm thời
Lỗi kết nối mạng → thử lại sau 30 giây
Thông báo lỗi
Hết số lần thử lại
Thông báo qua email: "Script đã thất bại sau 3 lần thử lại"
Theo dõi heartbeat
Thất bại thầm lặng
"Script không báo cáo thành công trước 8:15 sáng"
Prompt AI xử lý lỗi mạnh mẽ:
Thêm chức năng xử lý lỗi sẵn sàng cho môi trường sản xuất vào script tự động hóa của tôi: (1) Đặt mỗi thao tác chính trong khối try/except với các loại ngoại lệ cụ thể (không phải except thông thường), (2) Thêm logic thử lại cho các thao tác mạng: 3 lần thử lại với độ trễ lũy thừa (30 giây, 60 giây, 120 giây), (3) Ghi nhật ký tất cả các lỗi với đầy đủ dấu vết vào một file nhật ký xoay vòng (tối đa 10MB, giữ 5 vòng xoay), (4) Nếu script thất bại hoàn toàn, hãy gửi email cảnh báo kèm theo chi tiết lỗi, (5) Nếu script thành công, hãy ghi một file đánh dấu thành công (heartbeat) với dấu thời gian.
Thiết lập ghi nhật ký
Prompt AI về cấu hình ghi nhật ký:
Thiết lập ghi nhật ký Python cho script tự động hóa của tôi: (1) Ghi nhật ký cả vào console và file, (2) Console hiển thị INFO trở lên, file hiển thị DEBUG trở lên, (3) Định dạng nhật ký bao gồm dấu thời gian, cấp độ, tên hàm và thông báo, (4) Xoay vòng file nhật ký hàng ngày, giữ lại nhật ký trong 30 ngày, (5) Tạo một hàm setup_logging() có thể tái sử dụng mà tôi có thể nhập vào tất cả các script của mình.
Hướng dẫn về cấp độ ghi nhật ký:
Cấp độ
Sử dụng cho
Ví dụ
DEBUG
Thông tin khắc phục sự cố chi tiết
"Đang xử lý dòng 142 trên tổng số 5000 dòng"
INFO
Các mốc hoạt động bình thường
"Báo cáo đã tạo: 500 dòng, được lưu vào file output.xlsx"
WARNING
Một sự việc bất ngờ nhưng đã được xử lý ổn thỏa
"3 hàng thiếu email, được điền bằng địa chỉ mặc định"
ERROR
Thao tác thất bại nhưng script vẫn tiếp tục
"Không thể tải trang 15, bỏ qua"
CRITICAL
Script không thể tiếp tục
"Kết nối cơ sở dữ liệu thất bại sau 3 lần thử lại"
Giám sát các tự động hóa của bạn
Script giám sát heartbeat đơn giản:
Prompt AI:
Viết một script giám sát kiểm tra xem các script tự động hóa của tôi có chạy thành công hay không: (1) Mỗi script ghi một file "heartbeat" sau khi thành công: {script_name}_heartbeat.json với {"last_success": timestamp, "records_processed": count}, (2) Trình giám sát kiểm tra tất cả các file heartbeat và cảnh báo nếu lần thành công cuối cùng của bất kỳ script nào cũ hơn lịch trình dự kiến của nó (script hàng ngày → cảnh báo nếu > 25 giờ, script hàng giờ → cảnh báo nếu > 90 phút), (3) Tạo bản tóm tắt trạng thái hàng ngày: script nào đã chạy, khi nào, bao nhiêu bản ghi đã được xử lý, bất kỳ lỗi nào. Chạy trình giám sát này mỗi 30 phút.
✅ Kiểm tra nhanh: Script của bạn sử dụng mệnh đề except: bắt TẤT CẢ các ngoại lệ, bao gồm KeyboardInterrupt và SystemExit. Tại sao đây lại là một vấn đề?
Câu trả lời: Từ khóa except: bắt MỌI THỨ, bao gồm cả các ngoại lệ đáng lẽ phải dừng script: KeyboardInterrupt (Ctrl+C), SystemExit (sys.exit()) và MemoryError. Điều này khiến script không thể dừng một cách nhẹ nhàng. Luôn bắt các ngoại lệ cụ thể: except (requests.RequestException, ValueError) as e: — hoặc ít nhất, sử dụng except Exception as e: để loại trừ KeyboardInterrupt và SystemExit.
Những điểm chính cần ghi nhớ
Tự động hóa sản xuất cần ba lớp bảo vệ: logic thử lại cho các lỗi tạm thời (lỗi thời gian chờ mạng tự khắc phục), thông báo lỗi khi hết số lần thử lại (bạn biết về sự cố ngay lập tức) và giám sát heartbeat cho các lỗi âm thầm (script thậm chí không chạy) — nếu thiếu cả ba, bạn sẽ phát hiện ra lỗi muộn hàng giờ hoặc hàng ngày
Sử dụng mô-đun ghi nhật ký của Python thay vì `print()` cho các script tự động hóa — ghi nhật ký cung cấp dấu thời gian, mức độ nghiêm trọng, đầu ra file và xoay vòng mà bạn cần để gỡ lỗi những lỗi trong các script chạy tự động lúc 3 giờ sáng; Việc thiết lập chỉ mất 5 dòng code và tiết kiệm hàng giờ tìm hiểu.
Tập trung hóa việc lập lịch và xử lý lỗi khi hệ thống tự động hóa của bạn phát triển — một script lập lịch duy nhất với việc ghi nhật ký, thử lại và cảnh báo nhất quán trên tất cả các tác vụ sẽ dễ bảo trì hơn so với 5 script độc lập, mỗi script có cách xử lý lỗi riêng biệt.
Câu 1:
Bạn có 5 script tự động hóa, mỗi script chạy theo lịch trình khác nhau. Bạn đang quản lý chúng bằng 5 mục cron riêng biệt. Điều này đang trở nên khó theo dõi. Phương pháp nào tốt hơn?
GIẢI THÍCH:
Khi tự động hóa phát triển, quản lý tập trung trở nên thiết yếu. Một trình lập lịch hoặc wrapper duy nhất cung cấp khả năng ghi nhật ký, xử lý lỗi và thông báo nhất quán trên tất cả các script. Điều này ngăn chặn mô hình phổ biến là mỗi script tự triển khai (hoặc quên triển khai) các chức năng thử lại, cảnh báo và ghi nhật ký. Một trình chạy được thiết kế tốt cho tất cả các script sẽ dễ bảo trì hơn so với 5 trình chạy độc lập.
Câu 2:
Script tự động hóa của bạn sử dụng câu lệnh `print()` xuyên suốt để hiển thị tiến trình và lỗi. Một đồng nghiệp nói rằng bạn nên sử dụng mô-đun `logging` của Python thay thế. Đây có phải là sự khác biệt có ý nghĩa hay chỉ là sở thích về phong cách?
GIẢI THÍCH:
Đối với các script tự động hóa chạy theo lịch trình, việc ghi nhật ký là rất cần thiết. Đầu ra của hàm print() biến mất khi cửa sổ terminal đóng lại. Ghi nhật ký các thao tác ghi vào những file lưu trữ lâu dài với dấu thời gian, mức độ nghiêm trọng và ngữ cảnh — chính xác là những gì bạn cần khi gỡ lỗi tại sao script chạy lúc 3 giờ sáng thứ Hai lại thất bại. Việc thiết lập chỉ cần 5 dòng code và tiết kiệm hàng giờ gỡ lỗi.
Câu 3:
Script của bạn chạy mỗi sáng lúc 8 giờ thông qua cron. Một ngày nọ, nó bị lỗi vì trang web mục tiêu tạm thời không hoạt động (lỗi 503). Script ghi lại lỗi và thoát. Bạn không nhận thấy điều này cho đến 3 giờ chiều vì bạn không kiểm tra nhật ký. Làm thế nào để khắc phục điều này?
GIẢI THÍCH:
Tự động hóa sản xuất cần ba lớp bảo vệ: logic thử lại (xử lý các lỗi tạm thời tự động), thông báo lỗi (cảnh báo bạn khi hết số lần thử lại) và giám sát nhịp tim (phát hiện các lỗi âm thầm khi script không bao giờ chạy). Kiểm tra nhật ký thủ công không hiệu quả — cuối cùng bạn sẽ quên hoặc đang đi nghỉ khi xảy ra lỗi.
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây: