2011-11-18 15 views
9

Chcę uruchomić skrypt co 40 minut, począwszy od 40. minuty.
więc to znaczy:Jak ustawić cron do uruchamiania mojego skryptu co 40 minut/25 minut?

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

Więc zrobiłem to wejście do cron:

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

Niestety ten uruchamia skrypt każdy 40 minuta godziny:

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

To samo ze skryptem, który zamierzałem uruchomić co 25 minut.

Czy tu czegoś brakuje?


ODPOWIEDZI
porządku, w przypadku, gdy zdarzy się wpaść tu ten sam problem
oto jak I rozwiązać go:

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

Uwagi:
1. Nie będzie nadal być kolizjami w tym harmonogramie (tj .: patrz harmonogramy, które działają w 0 i 10 minucie w obu interwałach).
2. Skrypt nie będzie działał w dokładnym odstępie czasu od ostatniego uruchomienia, które nastąpi dzisiaj (tj. 25min przerwy kończy się @ 23: 45 dzisiaj, zaczyna @ 00: 25 następnego dnia).

+1

przeczytanie tego: http://stackoverflow.com/questions/745901/how-to-do-a-cron-job- co-72 minut –

+1

Dzięki! To jest do bani, ale myślę, że będę musiał teraz ustawić "ręczne" ustawienie interwałów jako brudną. – cr8ivecodesmith

+0

Wiem, że to było 4 lata, ale mogę mieć rozwiązanie dla 25 minutowego crona. Możesz uruchomić cron co minutę (lub co 5 minut ..), a skrypt wykryje, czy minęło 25 minut. Jeśli to prawda, to twój skrypt wykona swoje zadanie. – Kayla

Odpowiedz

10

Zawsze dzieli tylko bieżącą godzinę.

40/40 = 1, więc trwa co 40 minut.

*/5 zrobiłby 5, 10, 15, 20, ...

należy udać się do większych odstępach czasu.

Wykonaj */30 w odstępach 25-minutowych i co 60 minut w odstępach 40-minutowych.

Inaczej skonfigurować dwa crontaby dla skryptu:

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

Dzięki za wyjaśnienie. Jednak zmiana moich interwałów nie ma sensu. – cr8ivecodesmith

+0

Dodałem obejście dla przedziału 40 minut. Przy odrobinie więcej pracy, która będzie działać również w odstępach 25 minut. –

+0

Wow, to wygląda o wiele lepiej. Wielkie dzięki! :) – cr8ivecodesmith

4

do zadania, które chcesz osiągnąć trzeba napisać trochę więcej złożoną wpis w crontab.

Widzisz powyższy wzór?

00:40, 01:20, 02:00, 02:40, 03:20 i ponownie 04:00, 04:40, 05:20, 06:00, 06:40, 07:20, 08 : 00

mogę rozbicie go na trzech hasłach:

  1. Każdy nawet godziny trzeba uruchomić go na 40 min
  2. co dziwne godziny trzeba uruchomić go na 20 min
  3. Każdy nawet godzinę trzeba uruchomić na 0.(Z wyjątkiem 0 godzin)

Można to zrobić z więcej niż jednej pozycji:

#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 

UWAGA: To może mieć drobne problemy, ale nie dałem wam kierunek :)

PS: This will explain alot more

+0

Dzięki! Pójdę z tym teraz. To brzydkie, ale muszę to naprawić od razu. – cr8ivecodesmith

0

Będziesz musiał dodać kilka wpisów dla tego samego skryptu do crona, jeden do uruchomienia na godzinę, jeden do dwudziestu ostatnich i jeden do tw enty do godziny.

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 

Mówisz, że powinna rozpocząć się o 00:40, ale bieg poprzedniego dnia będzie o 23:20. Czy chcesz mieć 80 minut przerwy w pracy około północy?

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

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 40 minutes 
if [[ $(($minutesSinceEpoch % 40)) -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żna użyć tego podejścia z godzinę, codziennie lub co miesiąc crona:

#!/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 
Powiązane problemy