Kịch bản Python công việc định kỳ mỗi phút

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="//examplePublicKey@o0.ingest.sentry.io/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 2023, đị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="//examplePublicKey@o0.ingest.sentry.io/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

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 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="//examplePublicKey@o0.ingest.sentry.io/0",
        traces_sample_rate=1.0,
    ]
    4 ở trên.
    import sentry_sdk
    sentry_sdk.init[
        dsn="//examplePublicKey@o0.ingest.sentry.io/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="//examplePublicKey@o0.ingest.sentry.io/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="//examplePublicKey@o0.ingest.sentry.io/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

$ python run_archiver.py
Running Job
...
Success!

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="//examplePublicKey@o0.ingest.sentry.io/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="//examplePublicKey@o0.ingest.sentry.io/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="//examplePublicKey@o0.ingest.sentry.io/0",
        traces_sample_rate=1.0,
    ]
    8 hoặc
    $ python run_archiver.py
    Running Job
    ...
    Success!
    0

    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

    $ python run_archiver.py
    Running Job
    ...
    Success!
    1 của máy chủ, thường nằm ở
    $ python run_archiver.py
    Running Job
    ...
    Success!
    2. 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 vừa trên một dòng bắt đầu bằng 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

    import sentry_sdk
    sentry_sdk.init[
        dsn="//examplePublicKey@o0.ingest.sentry.io/0",
        traces_sample_rate=1.0,
    ]
    4
  • 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="//examplePublicKey@o0.ingest.sentry.io/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

    $ python run_archiver.py
    Running Job
    ...
    Success!
    4

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

    import sentry_sdk
    sentry_sdk.init[
        dsn="//examplePublicKey@o0.ingest.sentry.io/0",
        traces_sample_rate=1.0,
    ]
    7

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

    import sentry_sdk
    sentry_sdk.init[
        dsn="//examplePublicKey@o0.ingest.sentry.io/0",
        traces_sample_rate=1.0,
    ]
    8

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

    import sentry_sdk
    sentry_sdk.init[
        dsn="//examplePublicKey@o0.ingest.sentry.io/0",
        traces_sample_rate=1.0,
    ]
    9

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

    $ python run_archiver.py
    Running Job
    ...
    Success!
    5 hoặc
    $ python run_archiver.py
    Running Job
    ...
    Success!
    6 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
    $ python run_archiver.py
    Running Job
    ...
    Success!
    5 của bạn trước khi gọi tập lệnh của bạn

    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[] 
    3
  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 để thực hiện việc này là sử dụng liên kết nhị phân ________ 78 trong môi trường

    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[] 
    5

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
$ python run_archiver.py
Running Job
...
Success!
9 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

import sentry_sdk
sentry_sdk.init[
    dsn="//examplePublicKey@o0.ingest.sentry.io/0",
    traces_sample_rate=1.0,
]
40, 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 hướng 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à

import sentry_sdk
sentry_sdk.init[
    dsn="//examplePublicKey@o0.ingest.sentry.io/0",
    traces_sample_rate=1.0,
]
41

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[] 
9

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

import sentry_sdk
sentry_sdk.init[
    dsn="//examplePublicKey@o0.ingest.sentry.io/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="//examplePublicKey@o0.ingest.sentry.io/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 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 tác vụ đã 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

import sentry_sdk
sentry_sdk.init[
    dsn="//examplePublicKey@o0.ingest.sentry.io/0",
    traces_sample_rate=1.0,
]
42 cho lịch trình cron, bộ chọn
import sentry_sdk
sentry_sdk.init[
    dsn="//examplePublicKey@o0.ingest.sentry.io/0",
    traces_sample_rate=1.0,
]
43 được sử dụng khi đánh giá lịch trình của bạn và cuối cùng là
import sentry_sdk
sentry_sdk.init[
    dsn="//examplePublicKey@o0.ingest.sentry.io/0",
    traces_sample_rate=1.0,
]
44 chỉ định URL web sẽ kích hoạt

Ư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

Tôi có thể chạy công việc định kỳ mỗi phút không?

“Mỗi phút. ” Công việc định kỳ cứ sau 1 phút là một lịch trình định kỳ thường được sử dụng . Chúng tôi đã tạo Cronitor vì bản thân cron không thể thông báo cho bạn nếu công việc của bạn không thành công hoặc không bao giờ bắt đầu.

Làm cách nào để đặt crontab cho tập lệnh Python?

Tạo Tập lệnh Python của bạn;
Mở ga;
Viết crontab -e để tạo crontab;
Nhấn i để khởi chạy chế độ chỉnh sửa;
Write the schedule command * * * * * /usr/bin/python /path/to/file/.py ;.
Nhấn esc để thoát khỏi chế độ chỉnh sửa;
Viết. wq để viết crontab của bạn
Để xóa công việc đang chạy

Công việc định kỳ nào sẽ được sử dụng để chạy tập lệnh cứ sau 30 giây?

Crontab được sử dụng để lên lịch chạy tập lệnh theo định kỳ. Trong bài đăng trên blog này, bạn sẽ học cách lên lịch một tập lệnh trong crontab cứ sau 30 giây.

Chủ Đề