2008-10-29 11 views

Odpowiedz

10

Czy istnieje dobry powód, dla którego nie można korzystać z 1 godziny lub 2 godzin? Na pewno byłoby prostsze.

nie próbowałem tego osobiście, ale można znaleźć kilka informacji tutaj na uzyskanie cron uruchomić co 90 minut: http://keithdevens.com/weblog/archive/2004/May/05/cron

excert z powyższego linku:

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

Jakie wymaganie? Pierwsze zdanie kwestionuje konieczność 1,5 godziny, drugie dostarcza post na blogu z informacją, jak to zrobić co 1,5 godziny. – vfilby

+1

Wznowiono, ponieważ post na blogu poprawnie odpowiada na pytanie. –

+0

Nie wskazałem tego wyraźnie, gdy głosowałem na nie. Został on zredagowany od tego czasu, aby wyjaśnić, że link jest do potencjalnego rozwiązania na 90 minutowe pytanie. – Alnitak

32

To nie jest możliwe z pojedynczym wyrażeniem w normalnym cron.

Najlepiej można to zrobić bez modyfikowania kodu jest:

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

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

może być ściśliwy, w zależności od wersji crona trzeba:

0 */3 * * * [cmd]

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

4

Dwie linie w crontab. Wzdłuż linii:

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

Możesz to zrobić z dwoma wpisami crontab.Każdy kursuje co trzy godziny i są przesunięte o 90 minut mniej więcej tak:

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

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

0

można też użyć fcron który akceptuje także bardziej złożone wymagania czasowe, takie jak:

@ 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

dodaje następujące do mojego crontab i pracuje

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

Czy mógłbyś bardziej wyjaśnić, dlaczego jest to dobre rozwiązanie. –

1

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

90 - jest to jeden i pół godziny, w ciągu kilku minut

"> 60" - daję Cron zdolności do opóźniania rozpoczęcia scenariusza w czasie minuty

Również za pomocą tego hacka można ustawić dowolny okres z małą rozdzielczością

Na przykład skrypt uruchamiać co 71 minut

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

0

można osiągnąć dowolną częstotliwość jeśli liczyć minuty (, godziny, dni lub tygodni) od Epoch, dodać warunek do górnej części skryptu i ustawić skrypt, aby uruchomić każdą minutę na crontab : prąd

#!/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) powraca data, możemy formatować go jako sekundach od Epoki (%s), a następnie robimy podstawowe matematyki:

# .---------------------- 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 

a Możesz użyć tego podejścia w przypadku ofert pracy cronowej, dziennej lub miesięcznej:

#!/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

Witaj stefanmaric, ponieważ wydajesz się być stanowczym w tej sprawie, proszę dodać odpowiedź tylko do jednego z pytań i oznaczyć te, które są prawdziwymi duplikatami, jako duplikaty najlepszej kombinacji pytanie/odpowiedź. – bummi

+0

Witam @ albummi, faktycznie szukałem funkcji "oznacz jako duplikat". Nie znalazłem tego, więc napisałem. Robiąc więcej badań od czasu Twojego komentarza, dowiedziałem się, że nie mam wystarczającej reputacji, by zgłaszać pytania: http://meta.stackexchange.com/questions/118124/where-on-earth-is-the-mark-duplicate-ui-on -stack-overflow Dzięki za radę i przykro mi z powodu spamu. – stefanmaric

Powiązane problemy