Làm thế nào để lên lịch cho công việc máy chủ thông minh hơn so với cron?


15

Tôi điều hành công việc mỗi phút để giới thiệu lại nội dung trang web của mình.

Hôm nay, công cụ tìm kiếm đã chết, và khi tôi đăng nhập, có hàng trăm quy trình mồ côi đã được bắt đầu bởi cron.

Có cách nào khác sử dụng một số loại phần mềm hiện có sẽ cho phép tôi thực hiện công việc mỗi phút, nhưng điều đó sẽ không khởi động một trường hợp khác nếu công việc đó không quay trở lại (nghĩa là do quá trình công cụ tìm kiếm đã thất bại)?


4
Cron rất có thể đang làm chính xác những gì bạn đang nói với. Tôi đề nghị viết lại công việc một cách thông minh thay vào đó.
gparent

Câu trả lời:


27

Vấn đề không thực sự xảy ra với cron - đó là với công việc của bạn.

Bạn sẽ cần phải có công việc của bạn tương tác với một số mô tả. Cách dễ nhất để làm điều này là cố gắng tạo một thư mục và nếu tiếp tục thành công, nếu không thoát. Khi công việc của bạn đã kết thúc và thoát, nó sẽ xóa thư mục sẵn sàng cho lần chạy tiếp theo. Đây là một kịch bản để minh họa.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

Chạy cái này trong một thiết bị đầu cuối sau đó trước khi hết 60 giây, nó chạy trong thiết bị đầu cuối khác, nó sẽ thoát với trạng thái 1. Khi quá trình đầu tiên thoát ra, bạn có thể chạy nó từ thiết bị đầu cuối thứ hai ...

BIÊN TẬP:

Khi tôi vừa tìm hiểu về đàn, tôi nghĩ tôi sẽ cập nhật câu trả lời này. đàn (1) có thể dễ sử dụng hơn. Trong trường hợp flock -nnày có vẻ thích hợp, vd

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

Sẽ điều hành công việc của bạn mỗi phút nhưng sẽ thất bại nếu đàn không thể có được khóa trên tệp.


2
Câu hỏi ngu ngốc có thể, nhưng có bất kỳ lợi thế nào khi sử dụng một thư mục cụ thể hơn là một tệp thông thường không?
gparent

9
Sử dụng một tệp thông thường đòi hỏi một số thao tác, kiểm tra xem nó có tồn tại không, nếu không thì tạo nó. Điều này để lại một cửa sổ cơ hội cho một quá trình khác để tạo tệp - lộn xộn. Mkdir là một hoạt động nguyên tử, nó hoạt động và bạn có được 'khóa' hoặc nó không hoạt động như một quy trình khác đã có.
user9517 được hỗ trợGoFundMonica

Có ý nghĩa. Suy nghĩ tốt về thư mục khóa quá. Cảm ơn
John

2

Một cách là để tập lệnh reindex của bạn tạo một tệp khóa để nó có thể kiểm tra xem liệu đã có một phiên bản của tập lệnh đang chạy chưa. Bạn cũng có thể thêm vào một số xử lý ngoại lệ để xem công cụ tìm kiếm có hoạt động hay không.

Một lựa chọn khác có liên quan hơn sẽ là sử dụng một số loại hàng đợi nhiệm vụ như Resque và Resque-calendaruler:

https://github.com/blog/542- giới thiệu-resque

https://github.com/bvandenbos/resque-scheduler#readme

Ngoài ra còn có Qu và Sidekiq:

https://github.com/bkeepers/qu

https://github.com/mperham/sidekiq

Vâng, đó là tất cả định hướng của Ruby, nhưng bạn có thể tìm kiếm "những thứ như resque" bằng ngôn ngữ bạn chọn.


0

Một cách khác để nhanh chóng thiết lập điều này là khởi động kịch bản shell khi máy khởi động (cron có thể làm điều này với ' @reboot /path/to/my/script.sh', sau đó khởi động lại cron để khởi động nó) với một cái gì đó như thế này trong đó.

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

Kịch bản tiếp tục chạy và bạn chỉ mới bắt đầu một - đó là số lượng có thể chạy cùng một lúc - không nhiều hơn thế. Một số thông minh trong đó cũng có thể kiểm tra xem trình chỉ mục có đang chạy hay không và nếu không, hãy khởi động lại hoặc cố gắng khắc phục / thông báo cho ai đó về vấn đề.


-3

Thay vì sử dụng cron cho việc này, tôi sẽ xây dựng công việc của bạn nhiều hơn như một dịch vụ chạy trong vòng lặp và ngủ trong 60 giây như bước cuối cùng, hoặc có lẽ ngủ thường xuyên hơn trong các khoảng thời gian nhỏ hơn trong các điểm khác nhau trong quá trình để giúp giảm tải đồng đều hơn


1
Điều này sẽ không khắc phục vấn đề cũng như không phải là một cải tiến từ cron.
gparent

Nó sẽ khắc phục vấn đề, bởi vì sau đó chỉ có một quá trình chạy. Nó sẽ vượt qua hoàn toàn cron.
Joel Coel

Nó không khắc phục được sự cố nếu 'dịch vụ' không nhìn nếu công cụ tìm kiếm đang chạy. Kịch bản / công việc của anh ấy là vấn đề. EDIT: Thật ra, bạn có phần đúng, nó sẽ che giấu vấn đề theo một cách xấu xí.
gparent
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.