Cron chạy công việc cứ sau 15 giây


18

Bạn có thể tư vấn cho tôi những gì cần viết crontabđể nó chạy một số công việc (để kiểm tra tôi sẽ sử dụng /usr/bin/chromium-browser) cứ sau 15 giây không?


Thay vì crontab, hãy dựa vào một số hệ thống quản lý sự kiện khác, ví dụ: mô-đun every.pm của Perl sẽ giúp bạn làm điều này.
Nikhil Mulley

Câu trả lời:


27

Bạn không thể đi dưới mức độ chi tiết dưới một phút với cron. Những gì bạn có thể làm là, mỗi phút, chạy một kịch bản chạy công việc của bạn, đợi 15 giây và lặp lại. Dòng crontab sau đây sẽ bắt đầu some_jobcứ sau 15 giây.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

Kịch bản này giả định rằng công việc sẽ không bao giờ mất quá 15 giây. Kịch bản phức tạp hơn một chút sau đây sẽ xử lý việc không chạy phiên bản tiếp theo nếu quá lâu để chạy. Nó phụ thuộc vào dateviệc hỗ trợ %sđịnh dạng (ví dụ GNU hoặc Busybox, vì vậy bạn sẽ ổn trên Linux). Nếu bạn đặt nó trực tiếp trong một crontab, lưu ý rằng các %ký tự phải được viết như \%trong một dòng crontab.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

Tuy nhiên tôi sẽ lưu ý rằng nếu bạn cần điều hành một công việc thường xuyên cứ sau 15 giây, thì cron có lẽ là cách tiếp cận sai. Mặc dù các thông báo là tốt với các quy trình có thời gian tồn tại ngắn, nhưng chi phí cho việc khởi chạy chương trình cứ sau 15 giây có thể không đáng kể (tùy thuộc vào mức độ yêu cầu của chương trình). Bạn không thể chạy ứng dụng của mình mọi lúc và để nó thực thi nhiệm vụ cứ sau 15 giây?


cũng có thể là: đối với tôi trong 1 2 3 4 ; do some_job & sleep 15; done(giấc ngủ cuối cùng sẽ không ảnh hưởng đến lần chạy tiếp theo), nhưng cách bạn làm điều đó có lẽ tốt hơn cho thời gian của thư cronjob gửi đi (được gửi ngay sau vài giây cuối cùng, trong vòng 15 giây sau biến thể của tôi)
Olivier Dulac


13

Cách tiếp cận khác so với các cách khác: Chạy 4 cronjobs, mỗi lần so le trong 15 giây:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

Để ngăn công việc can thiệp vào chính nó, chúng tôi giới hạn thời gian chạy của nó là 15 giây thông qua lõi GNU ' timeoutcho mỗi công việc. Tuy nhiên, lưu ý rằng nếu công việc không thoát đúng cách ngay lập tức vào cuối 15s, bạn vẫn có thể gặp vấn đề. Xem hướng dẫn sử dụng để biết chi tiết về cách giải quyết nếu nó trở thành vấn đề. Cũng lưu ý, nếu lệnh mất nhiều thời gian hơn 15 giây và thời gian chờ sẽ giết chết nó, bạn sẽ nhận được trạng thái thoát khác không sẽ kích hoạt email cronjob.


Rực rỡ, mặc dù lặp đi lặp lại.
Mike Kormendy

1
Tốt đẹp. Nếu một quá trình chạy dài thì quá trình tiếp theo có thể cũng sẽ kết thúc trên một lõi khác. Không chắc chắn nếu bạn có thể cố tình thiết lập mối quan hệ cốt lõi cho các công việc Cron, nhưng điều đó có thể làm cho phương pháp này thậm chí còn tốt hơn.
Tim

@Tim điểm tốt. Tôi đã giải quyết phần nào trong một chỉnh sửa.
Otheus

2

Nói tóm lại, cron không phải là dạng hạt với thời gian. Thời gian ngắn nhất bạn sẽ nhận được là 1 phút.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

Tuy nhiên, bạn có thể viết một kịch bản sẽ chạy cứ sau 15 giây ...


Tôi có một dòng * * * * * /usr/bin/chromium-browsertrong crontab. Theo hướng dẫn, nó sẽ chạy mỗi phút nhưng không có gì là chạy.
xralf

Có khó để viết một kịch bản như vậy? Tôi nên hỏi một câu hỏi khác hoặc nó có thể được viết ở đây?
xralf

Các công việc định kỳ không có thiết bị đầu cuối nên tôi mong trình duyệt bị lỗi. Nó có thể làm như vậy âm thầm.
BillThor

Nhật ký cron của tôi được đặt trong / var / log / cron cho các dẫn xuất của redhat, tức là. fedora, centos, vv Nó cũng có thể giúp bạn mô tả chính xác những gì bạn đang cố gắng để mọi người có một bức tranh đầy đủ về những gì đang diễn ra.
rfelsburg

1

Trong crontab của bạn:

* * * *  /usr/bin/chromium-browser_starter

Sau đó trong /usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait

Khi tôi viết ps aux | grep chromsau một phút, tôi không thể thấy trình duyệt crom đang chạy.
xralf

@xralf - Kịch bản chỉ thực thi tối đa vài giây. Hãy thử grepping cho sleep.
amphetamachine
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.