2008-10-29 8 views

Trả lời

10

Có lý do chính đáng khiến bạn không thể sử dụng 1 giờ hoặc 2 giờ không? Nó sẽ đơn giản hơn cho chắc chắn.

tôi đã không cố gắng cá nhân này, nhưng bạn có thể tìm thấy một số thông tin ở đây vào việc cron để chạy mỗi 90 phút: http://keithdevens.com/weblog/archive/2004/May/05/cron

Một excert từ liên kết ở trên:

0 0,3,6,9,12,15,18,21 * * * <commands> 
30 1,4,7,10,13,16,19,22 * * * <commands> 
+1

Yêu cầu nào? Câu đầu tiên đặt câu hỏi cần thiết là 1,5 giờ, câu thứ hai cung cấp một bài đăng trên blog với thông tin về cách thực hiện nó cứ 1,5 giờ một lần. – vfilby

+1

Được thăng hạng vì bài đăng trên blog trả lời đúng câu hỏi. –

+0

Nó không tham chiếu rõ ràng khi tôi bỏ phiếu bầu. Nó đã được chỉnh sửa kể từ khi làm cho nó rõ ràng rằng liên kết là một giải pháp tiềm năng cho câu hỏi 90 phút. – Alnitak

32

Đó là không thể với một biểu thức duy nhất trong bình thường cron.

Điều tốt nhất bạn có thể làm mà không sửa đổi mã là:

0 0,3,6,9,12,15,18,21 * * * [cmd]

30 1,4,7,10,13,16,19,22 * * * [cmd]

Những thể được nén, tùy thuộc vào phiên bản của cron bạn phải:

0 */3 * * * [cmd]

30 1-23/3 * * * [cmd]

4

Hai dòng trong crontab. Dọc theo các dòng:

0 0,3,6,9,12,15,18,21 * * * /usr/bin/foo 
30 1,4,7,10,13,16,19,22 * * * /usr/bin/foo 
1

Bạn có thể làm điều đó với hai mục nhập crontab.Mỗi chạy mỗi ba giờ và họ được bù đắp bởi 90 phút một cái gì đó như thế này:

0 0,3,6,9,12,15,18,21 * * *

30 1,4,7, 10,13,16,19,22 * * *

0

Bạn cũng có thể sử dụng fcron mà cũng chấp nhận thông số kỹ thuật thời gian phức tạp hơn như:

@ 01h30 my_cmd 
1
#! /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/90  # Executes everything in that directory every 90 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

thêm dòng sau vào crontab của tôi và đang làm việc

15 */1 * * * root /usr/bin/some_script.sh >> /tmp/something.log 
+0

Bạn có thể mở rộng thêm về lý do tại sao đây là giải pháp tốt hay không. –

1

*/10 * * * * root perl -e 'exit(time()%(90*60)>60)' && command

90 - đó là một tiếng rưỡi trong vài phút

"> 60" - tôi đưa vào cron khả năng trì hoãn sự khởi đầu của kịch bản trong một phút

Cũng với sự trợ giúp của hack này, bạn có thể đặt bất kỳ khoảng thời gian nào với độ phân giải phút

Ví dụ: bắt đầu tập lệnh sau mỗi 71 phút

* * * * * root perl -e 'exit(time()%(71*60)>60)' && command

0

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 90 minutes (one and a half hours) 
if [[ $(($minutesSinceEpoch % 90)) -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 

Một 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 
+1

Hi stefanmaric, vì bạn có vẻ kiên quyết trong vấn đề này, vui lòng thêm câu trả lời cho chỉ một trong các câu hỏi và gắn cờ những người thực sự trùng lặp là bản sao của kết hợp câu hỏi/câu trả lời hay nhất. – bummi

+0

Hi @bummi, tôi thực sự đã tìm kiếm tính năng "đánh dấu là trùng lặp". Tôi đã không tìm thấy nó, vì vậy tôi đã đăng. Làm nghiên cứu thêm kể từ khi bình luận của bạn, tôi phát hiện ra tôi không có đủ danh tiếng để gắn cờ các câu hỏi: http://meta.stackexchange.com/questions/118124/where-on-earth-is-the-mark-duplicate-ui-on -stack-overflow Cảm ơn lời khuyên và tôi xin lỗi về spam. – stefanmaric