Có bất kỳ mẫu được thiết lập nào để cài đặt một khóa tắt hoặc bật / tắt cho các công việc định kỳ của người dùng không?


8

Chúng tôi có các bản dựng dài mà chúng tôi thường lên lịch cho các công việc định kỳ của mình, nhưng đôi khi chúng tôi phải chạy lại một bản dựng trong khung thời gian không chuẩn và có thể xảy ra xung đột với các công việc định kỳ thường an toàn để chạy vào thời điểm đó.

Chúng tôi có nhiều tài khoản chạy cả công việc xây dựng và cron, vì vậy chúng tôi không thể tạm dừng dịch vụ crontab cho toàn bộ máy và sau đó khởi động lại sau.

Tôi đã tự hỏi nếu có ai có một mô hình hoặc thực hiện. Tôi tưởng tượng điều này làm việc như thế nào

Người dùng tạo một tệp: ~ / block-crontab
người dùng chạy build Công việc cron tìm tệp đó trong thư mục chính của người dùng và nếu đó chỉ là bỏ qua tất cả các công việc cron. Nếu không, nó chạy các công việc Sau đó khi quá trình xây dựng hoàn tất, người dùng sẽ xóa ~ / block-crontab

Liệu điều đó có hiệu quả? Tôi đoán tôi cần phải sửa đổi tập lệnh cron bằng cách nào đó. Tôi chủ yếu tự hỏi nếu có một cách tiếp cận tốt hơn / tiêu chuẩn cho vấn đề này?

cảm ơn.


Bạn có ý nghĩa [the build] can run into conflicts with from jobs that are tipically safe to run at those timesgì? Có công việc không xây dựng nào không thể chạy trong quá trình xây dựng không? Có phải tất cả các công việc loại trừ lẫn nhau? Hay chỉ liên quan đến việc xây dựng?
GnP

1
Bạn đã xem phần giới thiệu flockhay run-one(Debian / Ubuntu) chưa? serverfault.com/questions/82857/
trộm

Ví dụ: chúng tôi chạy một bản cập nhật db lớn mỗi AM. Sau đó, mỗi giờ đến chiều chúng tôi làm mới trang nhất với tin tức hoặc các mục ngẫu nhiên. Nếu chạy trong bản cập nhật db, trang trước có thể có một số phần tử bị thiếu.
Sean

Không nhìn vào đàn hay chạy - một. Cảm ơn.
Sean

Câu trả lời:


10

Thay vì gây rối crond, tôi thực sự khuyên bạn nên thực hiện một số hình thức khóa (thậm chí đơn giản) bên trong các tập lệnh xây dựng của bạn. Ví dụ: chạm và kiểm tra tệp trong /var/run/: nếu tập lệnh của bạn tìm thấy thứ gì đó, hơn là một quy trình khác đang xây dựng dự án. Bạn rõ ràng cần phải gỡ bỏ lockfile khi hoàn thành.

Như @GnP đã lưu ý trong các bình luận, bạn cũng có thể sử dụng flocktiện ích để bán tự động quản lý các khóa của bạn.

Nếu bạn không / không thể dựa vào bất kỳ cơ chế khóa nào, vấn đề đơn giản là service crond stoptắt crondhệ thống.


2
Các flocklệnh sẽ là một bổ sung tốt đẹp để câu trả lời này. Nó xử lý các tập tin khóa và tất cả các chi tiết nhỏ có.
GnP

@GnP Gợi ý tuyệt vời! Tôi đã cập nhật câu trả lời của mình cho phù hợp
shodanshok

1
Chỉ cần lưu ý rằng với flockbộ mô tả tệp được kế thừa với các tiến trình con trừ khi bạn thực hiện một số động thái để đóng nó. Điều đó đôi khi có thể gây ra các hành vi bất ngờ, đặc biệt là nếu mọi người bắt đầu 'công việc nền' được thực thi bằng cron.
Matthew Ife

1

Tôi có xu hướng chỉ bọc tất cả các lệnh chạy dài trong một màn hình và cronchỉ khởi động màn hình nếu chưa có lệnh nào chạy.

Vì vậy, dòng sau trong crontab

*/2 * * * *  /bin/bash /path/to/LongRunningScript.bash

... biến thành một thứ như thế này:

*/2 * * * *  /usr/bin/screen -S MyUniqueName -Q select . || /usr/bin/screen -dmS MyUniqueName /bin/bash /path/to/LongRunningScript.bash

Tôi thích điều này bởi vì nó cũng cho bạn cơ hội để đính kèm vào một tập lệnh đang chạy và kiểm tra đầu ra / trạng thái của nó.

Trong kịch bản của bạn, bạn có thể cronkiểm tra màn hình khác trước khi thực hiện bản dựng, ví dụ

0 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS AutomatedBuild /bin/bash /path/to/BuildScripts.bash
10 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS OtherAutomatedBuild /bin/bash /path/to/OtherBuildScripts.bash

Khi bạn chạy một bản dựng thủ công, chỉ cần nhảy vào screentrước khi bạn chạy tập lệnh (vui lòng nhận xét nếu bạn cần gợi ý cách kết nối / ngắt kết nối screen. Đây là một tiện ích hữu ích - hãy thử nếu bạn chưa bắt đầu sử dụng)

Nhập screen -S ManualBuild, nhấn [enter]và chạy bất kỳ lệnh nào bạn muốn chạy.

Lưu ý: Nếu bạn sử dụng ví dụ như được cung cấp, bạn có thể nhầm lẫn cronnếu bạn có nhiều hơn 1 phiên màn hình với tên "ManualBuild" đang chạy.


Xin lỗi, chỉ cần thấy ghi chú "trên nhiều người dùng" của bạn - điều này sẽ không hoạt động trên người dùng mà không sửa đổi. Cần kiểm tra xem màn hình nào đó có hỗ trợ kết nối với các phiên của người dùng khác không.
trs

Đó là một ý tưởng tốt. Tôi phải phá vỡ thói quen của các nhà phát triển để mở các cửa sổ hạn của họ trong nhiều tháng. :)
Sean

Nếu họ để phiên của họ mở, bạn có thể đính kèm vào một màn hình đính kèm screen -x ScreenNamevà tùy thuộc vào bản phân phối của bạn (cài đặt suid cho screen), bạn có thể làm cho phiên màn hình có thể chia sẻ cho người dùng khác. Cách sạch nhất sẽ là chạy các lệnh xây dựng này dưới một tên người dùng cụ thể mà tôi đoán, cùng một người dùng sở hữu công việc định kỳ.
trs
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.