2011-11-18 44 views
9

Tôi muốn một tập lệnh chạy mỗi 40 phút bắt đầu vào phút thứ 40.
do đó có nghĩa:Làm thế nào để đặt cron để chạy tập lệnh của tôi cứ 40mins/25 phút?

00:40, 01:20, 02:00, 02:40, 03:20... 

Vì vậy, tôi viết vào cron:

*/40 * * * * /path/to/script/foo.sh 

Thật không may này chạy kịch bản mỗi phút thứ 40 của giờ:

00:40, 01:40, 02:40... 

Cũng vậy với kịch bản mà tôi muốn chạy mỗi 25 phút.

Tôi có thiếu gì đó ở đây không?


TRẢ LỜI
Alright, trong trường hợp bạn tình cờ ghé qua đây gặp vấn đề tương tự
dưới đây là cách tôi giải quyết nó:

# 40mins-interval 
40 0 * * * /path/foo.sh   (0) 
0,40 2-22/2 * * * /path/foo.sh (2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22) 
20 1-23/2 * * * /path/foo.sh (1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23) 


# 25mins-interval 
25,50 0 * * * /path/foo.sh    (0) 
0,25,50 5-20/5 * * * /path/foo.sh  (5, 10, 15, 20) 
15,40 1-21/5 * * * /path/foo.sh   (1, 6, 11, 16, 21) 
5,30,55 2-22/5 * * * /path/foo.sh  (2, 7, 12, 17, 22) 
20,45 3-23/5 * * * /path/foo.sh   (3, 8, 13, 18, 23) 
10,35 4-19/5 * * * /path/foo.sh   (4, 9, 14, 19) 

Ghi chú:
1. Sẽ có vẫn là các xung đột trong lịch biểu này (ví dụ: xem lịch biểu chạy vào ngày thứ 0 và thứ 10 trong cả hai khoảng thời gian).
2. Tập lệnh sẽ không chạy ở khoảng thời gian chính xác từ lần chạy cuối cùng của nó hôm nay vào ngày tiếp theo (ví dụ: khoảng 25 phút kết thúc @ 23: 45 hôm nay, bắt đầu @ 00: 25 ngày hôm sau).

+1

đọc: http://stackoverflow.com/questions/745901/how-to-do-a-cron-job- mỗi 72 phút –

+1

Cảm ơn! Điều này hút nhưng tôi đoán tôi sẽ phải làm các thiết lập 'thủ công' của các khoảng như một sửa chữa bẩn cho bây giờ. – cr8ivecodesmith

+0

Tôi biết nó đã được 4 năm, nhưng tôi có thể có một giải pháp cho cron 25 phút. Bạn có thể chạy cron mỗi phút (hoặc sau 5 phút ..) và tập lệnh của bạn sẽ phát hiện nếu 25 phút trôi qua. Nếu đó là sự thật, sau đó kịch bản của bạn sẽ làm công việc của mình. – Kayla

Trả lời

10

Nó luôn chỉ chia giờ hiện tại.

40/40 = 1 để nó chạy mỗi 40 phút một giờ.

*/5 sẽ làm 5, 10, 15, 20, ...

Bạn nên đi trong khoảng thời gian lớn hơn.

Làm */30 trong khoảng thời gian 25 phút và 60 phút một lần trong khoảng 40 phút của bạn.

Nếu không thiết lập hai crontabs cho kịch bản của bạn:

0,40 */2 * * * /path/to/script/foo.sh 
20 1,3,5,7,11,13,15,17,19,21,23 * * * /path/to/script/foo.sh 
+0

Cảm ơn bạn đã giải thích. Tuy nhiên, thay đổi khoảng thời gian của tôi là không đi. – cr8ivecodesmith

+0

Tôi đã thêm một công việc trong khoảng 40 phút. Với ít công việc hơn có thể hoạt động trong khoảng thời gian 25 phút. –

+0

Wow điều này có vẻ tốt hơn rất nhiều. Cảm ơn nhiều! :) – cr8ivecodesmith

4

Đối với công việc bạn muốn đạt được bạn phải viết thêm một chút entry phức tạp trong crontab của bạn.

Bạn thấy mẫu bên trên?

00:40, 01:20, 02:00, 02:40, 03:20 và một lần nữa 04:00, 04:40, 05:20, 06:00, 06:40, 07:20, 08 : 00

tôi có thể phá vỡ nó xuống thành ba mục:

  1. Mỗi giờ thậm chí bạn phải chạy nó ở 40 phút
  2. Mỗi giờ lẻ bạn phải chạy nó ở 20 phút
  3. Mỗi ngay cả giờ bạn phải chạy nó trên 0.(Trừ 0 giờ)

Bạn có thể thực hiện điều này với nhiều hơn một mục:

#1 
*/40 0,*/2 * * * /path/to/script/foo.sh 
#2 
*/20 1,*/2 * * * /path/to/script/foo.sh 
#3 
0 2,*/2 * * * /path/to/script/foo.sh 

LƯU Ý: Nó có thể có vấn đề nhỏ, nhưng ở đó tôi đã cho bạn hướng :)

PS: This will explain alot more

+0

Cảm ơn! Tôi sẽ đi với điều này bây giờ. Thật xấu xí nhưng tôi cần phải sửa lỗi này ngay lập tức. – cr8ivecodesmith

0

Bạn sẽ cần phải thêm một số mục nhập cho cùng một tập lệnh vào cron, một cho chạy trên giờ, một cho hai mươi quá khứ và một cho tw enty đến giờ.

0 0,2,4,6,8,10,12,14,16,18,20,22 * * * script 
20 1,3,5,7,9,11,13,15,17,19,21,23 * * * script 
40 0,2,4,6,8,10,12,14,16,18,20,22 * * * script 

Bạn nói rằng nó sẽ bắt đầu lúc 00:40, nhưng hoạt động của ngày hôm trước sẽ là 23:20. Bạn có muốn một khoảng cách 80 phút chạy khoảng nửa đêm không?

0
#! /bin/sh 

# Minute Cron 
# Usage: cron-min start 
# Copyright 2014 by Marc Perkel 
# docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron" 
# Free to use with attribution 

# Run this script under Cron once a minute 

basedir=/etc/cron-min 

if [ $# -gt 0 ] 
then 
    echo 
    echo "cron-min by Marc Perkel" 
    echo 
    echo "This program is used to run all programs in a directory in parallel every X minutes." 
    echo 
    echo "Usage: cron-min" 
    echo 
    echo "The scheduling is done by creating directories with the number of minutes as part of the" 
    echo "directory name. The minutes do not have to evenly divide into 60 or be less than 60." 
    echo 
    echo "Examples:" 
    echo " /etc/cron-min/1  # Executes everything in that directory every 1 minute" 
    echo " /etc/cron-min/5  # Executes everything in that directory every 5 minutes" 
    echo " /etc/cron-min/13  # Executes everything in that directory every 13 minutes" 
    echo " /etc/cron-min/75  # Executes everything in that directory every 75 minutes" 
    echo 
    exit 
fi 

for dir in $basedir/* ; do 
    minutes=${dir##*/} 
    if [ $((($(date +%s)/60) % $minutes)) -eq 0 ] 
    then 
     for program in $basedir/$minutes/* ; do 
    if [ -x $program ] 
    then 
     $program &> /dev/null & 
    fi 
     done 
    fi 
done 
2

Bạn có thể đạt được bất kỳ tần số nếu bạn đếm phút (giờ, ngày, hoặc vài tuần) kể từ Epoch, thêm một điều kiện để phía trên cùng của kịch bản của bạn, và thiết lập các kịch bản để chạy mỗi phút trên crontab của bạn : ngày

#!/bin/bash 

minutesSinceEpoch=$(($(date +'%s/60'))) 

# every 40 minutes 
if [[ $(($minutesSinceEpoch % 40)) -ne 0 ]]; then 
    exit 0 
fi 

date(1) lợi nhuận hiện tại, chúng tôi định dạng nó như giây kể từ Epoch (%s) và sau đó chúng tôi làm toán cơ bản:

# .---------------------- bash command substitution 
# |.--------------------- bash arithmetic expansion 
# || .------------------- bash command substitution 
# || | .---------------- date command 
# || | | .------------ FORMAT argument 
# || | | |  .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command 
# || | | |  | 
# ** * * *  * 
    $(($(date +'%s/60'))) 
# * * --------------- 
# | |  | 
# | |  ·----------- date should result in something like "1438390397/60" 
# | ·-------------------- it gets evaluated as an expression. (the maths) 
# ·---------------------- and we can store it 

Và bạn có thể sử dụng phương pháp này với các công việc cron theo giờ, hàng ngày hoặc hàng tháng:

#!/bin/bash 
# We can get the 

minutes=$(($(date +'%s/60'))) 
hours=$(($(date +'%s/60/60'))) 
days=$(($(date +'%s/60/60/24'))) 
weeks=$(($(date +'%s/60/60/24/7'))) 

# or even 

moons=$(($(date +'%s/60/60/24/656'))) 

# passed since Epoch and define a frequency 
# let's say, every 7 hours 

if [[ $(($hours % 7)) -ne 0 ]]; then 
    exit 0 
fi 

# and your actual script starts here 
Các vấn đề liên quan