2014-04-14 18 views
7

Bu betiği her 5 dakikada bir çalıştırmaya çalışıyorum. CRON işlerini OpenShift'te çalıştırmanın tek yolu, CRON eklentilerini kullanmaktır. Ve CRON eklentisi sadece, saatlik ve günlük betikleri (betiği ilgili klasöre yerleştirerek) sağlar.OpenShift (Red Hat Cloud) üzerinde her 5 dakikada bir CRON işi çalıştırın

#!/bin/bash 
php /var/lib/openshift/53434c795973ca1ddc000668/app-root/runtime/repo/scheduled.php > /dev/null 2>&1 

Ama (inceden klasörüne yerleştirilir çünkü) şu anda bu her dakika çalıştırır:

Bu komut dosyası her 5 dakikada bir çalışacak çalışıyorum.

Her 5 dakikada bir çalışacak şekilde nasıl yeniden yazabilirim?

cevap

10

Komut dosyasını, geçerli zamanı denetleyecek şekilde değiştirin ve 5 dakikadan fazla değilse, bu dosyayı kurtarın. Böyle

şey:

#!/bin/bash 

minute=$(date +%M) 
if [[ $minute =~ [05]$ ]]; then 
    php ... 
fi 

=~ operatörün sağ işlenen bir ifadedir; Geçerli dakika 0 veya 5 ile biterse yukarıdaki eşleşmeler. Diğer birkaç yaklaşım mümkündür:

if [[ $minute =~ .[05] ]]; then 

(0 veya 5 bir takiben herhangi bir karakter için kontrol; $minute her zaman tam olarak 2 karakterdir).

(Kullanıcı theshadowmonkey yorumunda önerir.

if [ $(($minute % 5)) -eq 0 ]; then 

$minute 5 katı olduğu, ama bir sorun bununla olup olmadığını aritmetik olarak kontrol eden bir $((...)) ifadede ifadede sıfır dolgulu sabitlerdir sekizlik muamelesi;. o 8 veya 9 dakika saat sonra halen eğer sabit 08 veya 09 Sen sed ile bu geçici olabilecek bir hata, ama başka çözümler vardır göz önüne alındığında, muhtemelen değerli değil)

+1

yukarıdaki cevap yanlış ve dakika 50-59 den her dakika yürütür. Yani değişiklik, "eğer [$ (($ dakika% 5)) -eq 0] ise" ve "işe yarıyor. Nedense benim düzenlemem reddedildi. Yani, sadece doğru cevabı yorumda bırakacağım. Yazar veya birisi bu ifadeyle cevabı düzenlemekte özgürdür. – theshadowmonkey

+1

@theshadowmonkey: Bitti. Bunu yakaladığın için teşekkürler. Çeşitli alternatifler ekledim (bunlar aşırıya kaçabilir). –

+1

@theshadowmonkey kullanırken [$ (($ dakika% 5)) -eq 0]; sonra hata alıyorum: 08: taban için çok büyük değer (hata belirteci "08") –

8

ben. e olacak xtend Keith Thompson yanıtı:

Onun çözümü her 5 dakikada bir mükemmel çalışır, ancak her 13 dakikada bir işe yaramaz;

5:13 
5:26 
5:30 
5:52 
6:00 because 0%13 is 0 
6:13 
... 

Ben sorunu fark eminim: Biz $minutes % 13 kullanırsanız bu zamanlamayı olsun.

#!/bin/bash 

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

if [[ $(($minutesSinceEpoch % 13)) -eq 0 ]]; then 
    php [...] 
fi 

date(1) döner geçerli tarih, biz Epoch'tan beri saniye cinsinden biçimlendirmek (%s) ve sonra biz temel matematik yapmak: Biz Epoch beri dakika (saat, gün veya hafta) sayarsan Herhangi frekansını elde edebilirsiniz :

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

ve OpenShift üzerinde saatlik, günlük veya aylık cron işleri ile bu yaklaşımı kullanabilirsiniz:

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

noti -ne (eşit olmayan) operatörünü betikten IF konstrüksiyonuna sarmak için -eq (eşit) operatörünü kullanmak yerine betikten çıkmak için kullandım; Kullanışlı buluyorum.

Ve sıklık için uygun .openshift/cron/{minutely,hourly,daily,weekly,monthly}/ klasörünü kullanmayı unutmayın.

0

minör cron job'dan yararlanabilirsiniz. İşler belirli bir frekansta çalışır ve işinizin çalıştığı tarihi ve/veya saati incelemek için işinizi yapabilirsiniz.

Her 5 dakikada bir iş çalıştırmak için bir örnek. Aşağıdaki kod parçacığını .openshift/cron/minutely/awesome_job yolundaki yürütülebilir bir dosyaya yerleştirin ve chmod +x awesome_job uygun izinlerini verin, ardından uygulama havuzunuza ekleyin, işleyin ve itin.

pasajı

#!/bin/bash 
if [ ! -f $OPENSHIFT_DATA_DIR/last_run ]; then 
    touch $OPENSHIFT_DATA_DIR/last_run 
fi 
if [[ $(find $OPENSHIFT_DATA_DIR/last_run -mmin +4) ]]; then #run every 5 mins 
    rm -f $OPENSHIFT_DATA_DIR/last_run 
    touch $OPENSHIFT_DATA_DIR/last_run 
    # The 'awesome_command(s)' that you want to run every 5 minutes 
fi 

Açıklama:

  • Bu parçacık aslında sadece notu aşağı son çalışma durumu 'last_run' adında boş bir dosya oluşturur ve daha sonra işinizi başlar.
  • Bir sonraki dakika, 'awesome_job' idam edilecek ve şimdi son 4 dakikada değiştirilen 'last_run' dosyasını bulmaya çalışıyor. Ama 'last_run' isimli dosyanız sadece bir dakika önce oluşturuldu ve bu nedenle durum başarısız ve çıkılıyor. Bu devam ediyor.
  • Beşinci dakikada (-mmin +4 ile) 'last_run' ifadesi görünecek ve şimdi 'last_run' dosyası silinecek ve yeniden oluşturulacak ve harika komutlarınız/komutlarınız çalıştırılacaktır.

Kaynak (Resmi Dokümanlar): https://developers.openshift.com/managing-your-applications/background-jobs.html#_execution_timing

İlgili konular