Cron tối thiểu, đảm bảo chỉ một trường hợp duy nhất


9

Có cách nào để chạy tập lệnh mỗi phút (hoặc 2 hoặc 5, v.v.) không, nhưng chỉ khi nó chưa chạy?

Chúng tôi có một tập các kịch bản cần chạy mỗi phút. Đôi khi họ có thể bắt đầu và kết thúc sau một giây, những lần khác họ có thể tiếp tục trong 5 phút.

Cách hiện tại của chúng tôi để tránh thực thi đồng thời là đặt is_runningcờ trong mỗi tập lệnh và thoát nếu nó vẫn được bật. Nhưng điều này hơi không đáng tin cậy (nghĩa là các lỗi nghiêm trọng sẽ khiến cờ vẫn được bật ngay cả khi tập lệnh tạm dừng).

Chúng tôi có thể viết người quản lý nhỏ của riêng mình, nhưng tôi tự hỏi liệu có một giải pháp thời trang hơn đã tồn tại.


+1 Tôi cũng quan tâm đến điều này. Tôi không biết câu trả lời, tuy nhiên tôi quan tâm đến các giải pháp có thể.
Saif Bechan

Một cron tinh tế ngửi thấy rất nhiều "làm cho tôi một daemon"
AD7six

Câu trả lời:


8

một cách tốt hơn là sử dụng flockthay vì pidfile. kiểm tra trang chủ: đàn (1) . Ưu điểm là cho dù quá trình kết thúc / chết như thế nào, khóa vẫn đi cùng với nó.


3

Tôi có xu hướng đồng ý với câu trả lời về tập tin của Warner. Tuy nhiên, tính năng sau đây của Anacron có thực hiện được điều này không?

-s
    Serialize execution of jobs. Anacron will not start a new job before the previous one finished. 

Tôi đã không tự mình kiểm tra, tôi không tìm thấy tài liệu của anacron đủ kỹ lưỡng ...

Nếu bạn muốn đặc biệt lười biếng ;-) Bạn chỉ có thể thoát khỏi tập lệnh nếu đi qua đầu ra ps trả về quá trình như đang chạy. Nhưng một tập tin khóa / pid là tốt nhất.


Anacron là phiên bản mới hơn của cron, vì vậy nó có nhiều tính năng hơn so với tiêu chuẩn cũ. về 'làm thế nào', nó có thể đăng ký một trình xử lý SIGCHLD, được kích hoạt khi một tiến trình con chết. do đó, nó có thể theo dõi những đứa trẻ đang chạy và chỉ cần bỏ qua những công việc đó.
Javier

@ Javier: Tôi không đồng ý với "anacron là phiên bản mới hơn của cron, vì vậy nó có nhiều tính năng hơn so với tiêu chuẩn cũ." Có một số sự chồng chéo giữa những gì anacroncronlàm, nhưng chúng giải quyết các vấn đề khác nhau. Sử dụng cron, làm thế nào bạn sẽ bắt đầu một công việc bị bỏ lỡ vì một máy bị hỏng? Sử dụng anacron, làm thế nào bạn sẽ bắt đầu một công việc cứ sau 25 tháng 12 hoặc cứ sau 5 phút? (Tất nhiên, bạn có thể giải quyết vấn đề về kịch bản, nhưng đó không phải là điều tôi đang nói đến.)
Tạm dừng cho đến khi có thông báo mới.

@Kyle: Tùy chọn đó khiến các công việc khác nhau được lên lịch chạy cùng lúc để chạy từng công việc. Nó có thể hoạt động cho nhu cầu của OP, nhưng nó sẽ chặn các công việc khác hoặc các công việc khác sẽ chặn nó. Ngoài ra, anacronkhông chạy trong khoảng thời gian ngắn hơn một ngày.
Tạm dừng cho đến khi có thông báo mới.

@Dennis Williamson: Tôi đoán bạn đúng, tôi chưa kiểm tra chi tiết lịch sử. Nhưng tôi đoán bạn sẽ đồng ý rằng dự án anacron đã bắt đầu sau khi cron được thiết lập khá nhiều và được lấy cảm hứng từ nó; do đó, không có gì ngạc nhiên khi nó có các tính năng mà cron không có. Ngoài ra, câu hỏi ban đầu là về cron
Javier

1

Đó là giải pháp thích hợp cho phương pháp đó. Thông thường, một tệp pid sẽ được sử dụng và kiểm tra pid sẽ được thực hiện theo quy trình để đảm bảo nó đang chạy. Nếu cũ, lockfile sẽ bị xóa và quá trình sẽ chạy.

Bất kỳ trí thông minh bổ sung nào thường sẽ được viết trong chính phần mềm, như một daemon, trái ngược với việc chạy trong cron.


1

Nếu tập lệnh của bạn được mã hóa bằng ngôn ngữ hỗ trợ tòa nhà của bầy (2), thì bạn cũng có thể tập tin () một tệp khóa có chức năng gọi. Thí dụ:

Nếu bạn bị mắc kẹt với Bash hoặc ngôn ngữ kịch bản lệnh khác không hỗ trợ điều này, giải pháp đã được đề xuất với đàn (1) cũng tốt.

PS Trong mọi trường hợp, bạn chỉ nên tạo một tệp khóa riêng biệt (nếu nó chưa tồn tại) và không bao giờ xóa nó. Thư mục "/ var / lock" là một nơi tốt cho các tệp như vậy.


0

Đây là một giải pháp nếu tập lệnh của bạn chạy bằng python (hoặc bạn có thể tạo lệnh python để chạy trước lệnh tiếp theo) - Tôi đã gặp vấn đề chính xác này vào tuần trước, và mặc dù tôi đã tìm thấy một số giải pháp tốt, tôi đã quyết định thực hiện gói python đơn giản và sạch sẽ và tải nó lên PyPI. Bạn chắc chắn có thể khóa __file__để không phải suy nghĩ về việc đặt cho nó một tên tài nguyên tùy chỉnh để khóa.

Cài đặt với: pip install quicklock

Sử dụng nó cực kỳ đơn giản:

[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> # Let's create a lock so that only one instance of a script will run
...
>>> singleton('hello world')
>>>
>>> # Let's try to do that again, this should fail
...
>>> singleton('hello world')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/nate/live/gallery/env/lib/python2.7/site-packages/quicklock/quicklock.py", line 47, in singleton
    raise RuntimeError('Resource <{}> is currently locked by <Process {}: "{}">'.format(resource, other_process.pid, other_process.name()))
RuntimeError: Resource <hello world> is currently locked by <Process 24801: "python">
>>>
>>> # But if we quit this process, we release the lock automatically
...
>>> ^D
[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> singleton('hello world')
>>>
>>> # No exception was thrown, we own 'hello world'!

Hãy xem: https://pypi.python.org/pypi/quicklock

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.