Tập lệnh Crontab Python

Nhiều công ty sử dụng ngôn ngữ lập trình Python cho các ứng dụng khoa học dữ liệu, mô hình máy học và các loại tác vụ phân tích khác. Vì Python thường chỉ được sử dụng cho các dự án cụ thể nên nhiều doanh nghiệp phải tích hợp nó vào quy trình làm việc của họ theo chương trình. Điều này có nghĩa là họ cần một cách để tự động hóa quy trình để quy trình chạy độc lập khi cần thiết và theo lịch trình. May mắn thay, có nhiều cách để tích hợp Python với các công việc định kỳ để tự động hóa việc thực thi thường xuyên khi cần thiết

Trong bài viết này, bạn sẽ tìm hiểu cách lên lịch Python bằng cách sử dụng cron và một số ví dụ hữu ích về thời điểm và cách bạn có thể sử dụng các phương pháp này trong tổ chức của mình

Chạy tập lệnh Python với Crontab

Tôi đã tạo một ứng dụng Python mẫu, yêu cầu tập lệnh chạy 15 phút một lần. Bạn có thể sử dụng

import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
8 để mở trình chỉnh sửa crontab và thêm công việc như bên dưới

Tập lệnh Python có thể được định cấu hình bằng một trong các tùy chọn bên dưới tùy thuộc vào môi trường

  • Phiên bản Python mặc định. Nếu ứng dụng chạy với phiên bản Python mặc định của hệ thống, hãy sử dụng cài đặt crontab bên dưới.
    */15 * * * * python /home/tecadmin/app/cron.py
    
  • Phiên bản Python không mặc định. Bạn có thể sử dụng các phiên bản Python khác bằng cách cung cấp đường dẫn nhị phân hoàn chỉnh. Một số ứng dụng yêu cầu phiên bản Python không được đặt làm mặc định trên hệ thống
    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
  • Python với môi trường ảo. Các ứng dụng chạy với môi trường ảo Python có thể được lên lịch như bên dưới. Đây
    import sentry_sdk
    sentry_sdk.init(
        dsn="https://[email protected]/0",
        traces_sample_rate=1.0,
    )
    9 là thư mục chứa các tệp môi trường ảo.
    */15 * * * * /home/tecadmin/app/venv/bin/python  /home/tecadmin/app/cron.py
    

Gói (lại

Trong hướng dẫn cách thực hiện nhanh này, bạn đã học cách lên lịch cho các tập lệnh Python bằng crontab trong hệ thống Linux và macOS

Theo chỉ số TIOBE, Python là ngôn ngữ lập trình phổ biến nhất được sử dụng trên toàn thế giới vào tháng 6 năm 2022, với 12. 2% chia sẻ. Python phổ biến vì nó dễ học, có các thư viện xuất sắc và đạt điểm cao về hiệu suất cũng như tính linh hoạt thu hút các nhà phát triển, nhà khoa học dữ liệu và nhà phân tích. Tính linh hoạt này cũng làm cho Python trở thành một lựa chọn mạnh mẽ và phổ biến khi tạo một công việc định kỳ

Trước khi đi xa hơn, chúng ta nên định nghĩa chính xác cron a job là gì. Theo định nghĩa cổ điển, một công việc định kỳ là một lệnh trên máy chủ Linux hoặc Unix chạy theo lịch trình do người dùng xác định bằng cách sử dụng bộ lập lịch trình

import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
2 cấp hệ thống. Điều này vẫn đúng cho đến ngày nay và hiện tại đã gần 50 năm tuổi, các công cụ lập lịch định kỳ trên toàn thế giới đang chạy nhiều công việc hơn bao giờ hết. Nhưng cũng đúng là ở đây vào năm 2022, định nghĩa về công việc định kỳ đã được mở rộng khá nhiều và thường có nghĩa là một thứ gì đó đang chạy trong nền vào một thời điểm đã lên lịch

Hầu hết thời gian, nhưng không phải lúc nào cũng vậy, một đặc điểm xác định của công việc định kỳ là cú pháp lịch trình cron khét tiếng, một định dạng ngắn gọn để xác định hầu hết mọi loại lịch trình trông giống như một biểu thức chính quy. Những lịch trình này, như

import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
3 đủ khó để đọc và viết mà 400.000 khách truy cập sử dụng Crontab Guru mỗi tháng để giải mã chúng thành tiếng Anh đơn giản

Hiểu công việc định kỳ của bạn

Tập lệnh Crontab Python
Nắm bắt trạng thái, số liệu và nhật ký từ mọi công việc

Cảnh báo tức thì khi một công việc thất bại hoặc không bao giờ bắt đầu

Tìm hiểu thêm

Cách tạo một công việc định kỳ với Python

Hướng dẫn này sẽ giới thiệu một số cách phổ biến nhất để tạo các công việc định kỳ với Python, nhưng nó không có nghĩa là một danh sách đầy đủ. Có nhiều thư viện và nền tảng để chạy công việc, nhưng ở đây chúng tôi sẽ đề cập


Chạy tập lệnh Python dưới dạng công việc định kỳ

Trước khi bạn có thể lên lịch mã python của mình để chạy như một công việc định kỳ, bạn cần tổ chức nó dưới dạng một tập lệnh mà bạn có thể chạy từ dòng lệnh. Nếu mã của bạn tồn tại bên trong thứ gì đó như chế độ xem Django hoặc đường dẫn FastAPI, thì bạn sẽ cần thực hiện một số thao tác tái cấu trúc để chuyển mã vào một mô-đun dùng chung mà khung của bạn có thể sử dụng và được gọi trực tiếp trong tập lệnh Python

Nếu bạn đang chạy mã của mình dưới dạng tập lệnh dòng lệnh lần đầu tiên, thì thường có một vài điều mà mọi tập lệnh đều cần

  1. Bạn sẽ cần nhập mọi thư viện bạn sử dụng và một số thư viện có thể yêu cầu khởi tạo. Trong ví dụ này, tập lệnh đang tải và khởi tạo Django.
    import os
    import sys
    import django
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)
    django.setup()
    
    from application import archiver
    archiver.run() 
  2. Nếu bạn đang sử dụng bất kỳ công cụ quan sát nào như Sentry hoặc DataDog, bạn sẽ cần đảm bảo rằng chúng được khởi tạo bởi bất kỳ mã nào bạn đang gọi hoặc khởi tạo chúng ở đây như một phần của bootstrap của bạn. Ví dụ: mã khởi tạo Sentry này có thể được thêm vào trước khi gọi
    import sentry_sdk
    sentry_sdk.init(
        dsn="https://[email protected]/0",
        traces_sample_rate=1.0,
    )
    4 ở trên.
    import sentry_sdk
    sentry_sdk.init(
        dsn="https://[email protected]/0",
        traces_sample_rate=1.0,
    )
  3. Viết nhật ký tiến trình và lỗi vào thiết bị xuất chuẩn bằng cách định cấu hình trình ghi nhật ký hoặc chỉ cần sử dụng
    import sentry_sdk
    sentry_sdk.init(
        dsn="https://[email protected]/0",
        traces_sample_rate=1.0,
    )
    5. Người dùng Cronitor sẽ có thể xem toàn bộ đầu ra cho tất cả các công việc trực tiếp trong giao diện người dùng Cronitor, nhưng ngay cả khi bạn không sử dụng Cronitor, đầu ra này được cron thu thập tự động cho các công việc không thành công, vì vậy, đây là cách tốt nhất cho dù bạn đã chọn gì cho
  4. Lưu tập lệnh của bạn và cam kết nó với kiểm soát nguồn của bạn. Chúng tôi sẽ gọi kịch bản của chúng tôi là
    import sentry_sdk
    sentry_sdk.init(
        dsn="https://[email protected]/0",
        traces_sample_rate=1.0,
    )
    6

Với kịch bản trong tay, điều đầu tiên bạn nên làm là tự chạy nó từ dòng lệnh để đảm bảo rằng nó chạy thành công và ghi nhật ký đầu ra mà bạn sẽ muốn xem từ công việc của mình

*/15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
0

Cuối cùng, đã đến lúc đăng ký tập lệnh của bạn với trình nền

import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
2 đang chạy trên máy của bạn. Có nhiều cách để lên lịch các công việc định kỳ nhưng hướng dẫn này sẽ tập trung vào hai tùy chọn đơn giản. Phương pháp bạn chọn sẽ phụ thuộc vào việc bạn có quyền truy cập
import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
8 trên máy linux hay không

  • Lên lịch cho một công việc định kỳ khi bạn có đặc quyền
    import sentry_sdk
    sentry_sdk.init(
        dsn="https://[email protected]/0",
        traces_sample_rate=1.0,
    )
    8 hoặc
    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    00

    Với quyền truy cập cấp quản trị viên vào một phiên bản linux, cách tốt nhất để lên lịch một công việc định kỳ cho các tập lệnh của bạn là tạo một tệp crontab dành riêng cho ứng dụng trong thư mục

    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    01 của máy chủ, thường nằm ở
    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    02. Thư mục "thả vào" này được cron quét mỗi phút và tất cả những gì bạn cần làm là sao chép tệp crontab vào vị trí và đợi thời gian đã lên lịch để công việc của bạn chạy

    Bản thân tệp crontab có định dạng rất đơn giản. Nó có thể bao gồm các nhận xét, biến môi trường và các công việc sẽ được chạy. Mỗi công việc phải nằm trên một dòng bắt đầu bằng một biểu thức lịch trình cron hợp lệ, công việc sẽ chạy với tên người dùng và cuối cùng là chuỗi lệnh sẽ được chạy

    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    7
  • Lên lịch cho một công việc định kỳ mà không có đặc quyền
    import sentry_sdk
    sentry_sdk.init(
        dsn="https://[email protected]/0",
        traces_sample_rate=1.0,
    )
    8

    Nếu quản trị viên hệ thống của bạn cho phép, các công việc định kỳ cũng có thể được người dùng lên lịch trong tệp crontab của người dùng riêng tư. Những crontab người dùng này chỉ có thể chạy các lệnh như chính bạn. Để tương tác với crontab người dùng của bạn, hãy sử dụng lệnh

    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    04

    Xem tập tin crontab của bạn

    */15 * * * * /home/tecadmin/app/venv/bin/python  /home/tecadmin/app/cron.py
    
    0

    Mở crontab của bạn trong trình soạn thảo văn bản để cập nhật

    */15 * * * * /home/tecadmin/app/venv/bin/python  /home/tecadmin/app/cron.py
    
    1

    Từ trình soạn thảo văn bản, thêm mục cron mới của bạn

    */15 * * * * /home/tecadmin/app/venv/bin/python  /home/tecadmin/app/cron.py
    
    2

Với kịch bản của bạn được viết, kiểm tra và lên lịch, bạn gần như đã hoàn thành. Bạn sẽ nghĩ rằng một tập lệnh phù hợp với bạn cũng sẽ hoạt động khi được chạy dưới dạng một công việc định kỳ, nhưng có một số điểm khác biệt chính giữa trình bao của bạn và môi trường thực thi định kỳ và những khác biệt này thường có thể gây đau đầu khi lên lịch công việc

  1. Sử dụng đường dẫn tuyệt đối

    Thư mục làm việc hiện tại được Cron sử dụng phụ thuộc vào một số yếu tố, nhưng đó thường là thư mục chính của chủ sở hữu công việc. Tránh bất kỳ sự nhầm lẫn nào ở đây bằng cách sử dụng riêng các đường dẫn đủ điều kiện khi bạn thêm công việc vào tệp crontab. Tương tự, nếu tập lệnh của bạn đang gọi bất kỳ lệnh nào khác, tập lệnh đó nên sử dụng đường dẫn đủ điều kiện hoặc đặt thư mục làm việc của chính nó trước khi thực hiện bất kỳ lệnh gọi nào

  2. Mang theo các biến môi trường của bạn

    Mặc dù cron chạy các công việc định kỳ của bạn bằng tài khoản người dùng thực, nhưng nó không kích hoạt phiên tương tác, do đó, bất kỳ biến môi trường nào bạn có thể tải trong

    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    05 hoặc
    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    06 sẽ không khả dụng. Nếu tập lệnh của bạn mong đợi một số biến môi trường nhất định, bạn có thể đặt chúng trong chính tệp crontab hoặc để mỗi dòng trong crontab của bạn lấy nguồn
    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    05 trước khi gọi tập lệnh của bạn

    */15 * * * * /home/tecadmin/app/venv/bin/python  /home/tecadmin/app/cron.py
    
    6
  3. Tùy chọn gọi môi trường ảo của bạn

    Nếu bạn đang sử dụng một công cụ như virtualenv để cô lập các phần phụ thuộc Python của mình, bạn sẽ cần kích hoạt môi trường ảo đó khi gọi tập lệnh của mình. Cách dễ nhất để làm điều này là sử dụng mã nhị phân

    */15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
    
    08 được liên kết tượng trưng trong môi trường

    */15 * * * * /home/tecadmin/app/venv/bin/python  /home/tecadmin/app/cron.py
    
    8

Bằng cách làm theo các phương pháp hay nhất này và với một chút may mắn, hy vọng bạn sẽ thấy rằng công việc định kỳ của mình chạy chính xác vào thời gian đã định và kết thúc thành công. Nếu bạn không may mắn như vậy, chúng tôi có một hướng dẫn khắc phục sự cố toàn diện cho các công việc định kỳ sẽ hướng dẫn bạn từng bước về những lý do gây ra hầu hết các công việc định kỳ thất bại


Chạy một công việc định kỳ bằng cách sử dụng */15 * * * * /usr/bin/python3.10 /home/tecadmin/app/cron.py 09 với bộ lập lịch nhịp

Cần tây là một thư viện Python phổ biến để chạy các tác vụ nền với hàng đợi tác vụ không đồng bộ kích hoạt các lệnh trong một quy trình công nhân riêng biệt. Trường hợp sử dụng phổ biến nhất là thêm công việc vào hàng đợi tác vụ cần thiết từ mã ứng dụng của bạn khi người dùng thực hiện những việc như yêu cầu email đặt lại mật khẩu. Khi bạn sử dụng gói

*/15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
70, bạn cũng có thể thêm các công việc đã lên lịch cùng với các tác vụ theo sự kiện này. Ghi chú. Hướng dẫn này giả định rằng bạn đã chạy Celery trong ứng dụng của mình

Đầu tiên, tìm mã khởi tạo Celery của bạn và thêm một tác vụ cho công việc định kỳ mới của bạn. Điều này thường nằm trong một tệp có tên là

*/15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
71

import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
2

Xác định lịch đánh nhịp sẽ được Celery đọc khi khởi động

import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
0

Thưởng. Tự động theo dõi các công việc cron Celery của bạn với Cronitor

import sentry_sdk
sentry_sdk.init(
    dsn="https://[email protected]/0",
    traces_sample_rate=1.0,
)
1

Sử dụng công cụ của bên thứ ba như Google Cloud Scheduler để chạy mã Python của bạn

Ý tưởng đằng sau bộ lập lịch trên đám mây rất đơn giản. Bạn cung cấp lịch trình và URL tới điểm cuối trong ứng dụng web của mình và dịch vụ sẽ tải điểm cuối của bạn vào những thời điểm thích hợp, thường có các tính năng thú vị như thử lại và chụp đầu ra. Các nhà cung cấp đám mây lớn cung cấp bộ lập lịch, ví dụ như Google Cloud Scheduler do GCP cung cấp và có một số dịch vụ SaaS khác để lên lịch và chạy công việc, bao gồm cả dịch vụ miễn phí phổ biến Cron-Job. tổ chức

Dưới đây là biểu mẫu cấu hình cho một công việc đã lên lịch mới bằng Trình lập lịch biểu đám mây. Ngoài các trường phổ biến như tên và mô tả, bạn còn lại các tùy chọn cấu hình giống như bạn tìm thấy với các công việc định kỳ của Linux hoặc Celery. Trường

*/15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
72 cho lịch trình cron, bộ chọn
*/15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
73 được sử dụng khi đánh giá lịch trình của bạn và cuối cùng là
*/15 * * * * /usr/bin/python3.10  /home/tecadmin/app/cron.py
74 chỉ định URL web để kích hoạt

Tập lệnh Crontab Python

Ưu điểm của việc sử dụng bộ lập lịch của bên thứ 3 là bạn có thể thêm một công việc định kỳ vào ứng dụng của mình chỉ bằng cách thêm một điểm cuối mới và lên lịch cho URL của nó để thực thi. Đây là một phương pháp phổ biến để bắt đầu với các công việc định kỳ, nhưng có một số lo ngại với phương pháp này có thể dẫn đến việc thực thi công việc định kỳ không đáng tin cậy

* * * * * Trong công việc định kỳ là gì?

Định dạng công việc định kỳ . Bạn có thể sử dụng bảng điều khiển Google Cloud, Google Cloud CLI hoặc API REST của Trình lập lịch biểu đám mây để đặt lịch trình của mình. a set of five fields in a line, indicating when the job should be executed. You can use either the Google Cloud console, the Google Cloud CLI, or the Cloud Scheduler REST API to set your schedule.

Làm cách nào để cài đặt crontab trong Python?

Cài đặt python-crontab . Điều này sẽ tự động cài đặt mô-đun cần thiết và khi bạn đã hoàn tất với mô-đun đó, chúng ta sẽ sẵn sàng làm việc với mô-đun đó. install the required module, this can be done with the pip package manager command in the shell. This should automatically install the required module, and once you're done with it, we should be ready to work with it!