Cron'a her gün bir komut çalıştırmasını nasıl söyleyebilirim (tek / çift)


45

Cron'u "Her Gün" alanını kullanarak her gün bir komut çalıştırmak üzere yapılandırırken, şöyle:

1 22 */2 * * COMMAND

ayın garip olduğu her zaman çalışır: 1,3,5,7,9 vb.

Cron'u, 2,6,8,10 ve benzeri ayların günlerinde çalışacak şekilde nasıl yapılandırabilirim (kelimenin tam anlamıyla belirtmeden, her ayın farklı gün sayısı olduğu için sorunlu olan)?

Yanıtlar:


60

Denediğiniz sözdizimi aslında belirsiz. Ay içinde kaç gün olduğuna bağlı olarak, bazı aylar tuhaf günlerde, hatta bazılarında çalışır. Bunun nedeni, hesaplanma biçiminin toplam olasılık sayısını alması ve onları ayırmasıdır. Gündüz aralığını manuel olarak belirleyerek ve tek veya çift gün sayısı kullanarak bu zorlama davranışını aşabilirsiniz. Günün senaryoları bile uzun ayların 31'inci gününde yayınlanmayacağından, günleri 30 gün boyunca temel olarak 30 gün kullanarak hiçbir şey kaybetmezsiniz ve 31 gün olmuş gibi bölmek için özel olarak belirleyerek garip olabilirsiniz günlük uygulama.

Sözdizimi şöyle görünür:

# Will only run on odd days:
0 0 1-31/2 * * command

# Will only run on even days:
0 0 2-30/2 * * command

Aynı gün sayısına sahip olmayan aylara ilişkin endişeniz burada önemli değil çünkü hiçbir ay bundan daha fazla gün yok ve Şubat ayındakiler için tarih aralığı son iki güne denk gelmeyecek, ancak zarar vermeyecek listelenmiştir.

Bu yaklaşım için tek 'gotcha' garip bir gün döngüsü içindeyseniz, 31 günden sonra ayları izleyerek emrinizin de ayın ilk günü başlayacağıdır. Aynı şekilde, eşit bir çevrimi zorluyorsanız, her artık yıl bir üç günlük döngüye ve Şubatın sonuna neden olur. Düzenli bir "her gün" biçiminin her ay her zaman eşit ya da tuhaf günlere düşmeyeceği ve bunu zorladığınız herhangi bir şekilde ekstra bir koşuya sahip olamayacağınız ya da arasında bir koşuya sahip olamayacağınız gerçeğini gerçekten anlayamazsınız. eşleşmeyen gün sayımları olan aylar.


1
Teşekkürler, peki sadece 28 gününüzün olduğu şubat aylarında ne olacak? Yıldız aslında bununla ilgileniyor - ama gerçekten belirsiz.
Freddie

3
@freddie: Düzenlenmiş cevabımı gör ... ama sorun değil çünkü aralık dışı değerler göz ardı edilecek, 30 ya da 31 Şubat'ta hiçbir şey olmayacak. Hiç. Gibi bir liste ile manuel olarak belirtebilirsiniz 0,2,4...,30,32,34ve farketmez, aralık dışı değerler hiçbir zaman eşleşmez.
Caleb

1
Teşekkürler! Anlıyorum, bilgilendirici cevap için teşekkür ederim!
Freddie

3
Ubuntu sunucusu 8.04'te, ayın sıfır gününü kullanan sözdiziminin geçersiz olduğu (ayın kötü günü) görünüyor. Bununla birlikte, aşağıdaki sözdizimi kabul edilir:0 0 2-30/2 * * command

1
Fedora ve RHEL 5,6,7 de ayın bir günü olarak 0'dan hoşlanmıyor. User31053 işaret ettiği 0 0 2-30/2 * * commandgibi: beklendiği gibi çalışır.
NoelProf

2

Sanırım şöyle bir olasılık, yılın gününü kullanıyor:

# for odd days
test $(((`date +%j` % 2))) != 0 && command

# for even days
test $(((`date +%j` % 2))) == 0 && command

Unix ve Linux sistemleri için test edilmiştir.


Bu cevabı tercih ediyorum, çünkü birkaç ay içinde gün sayısı ile problemi atlıyor. Neyse, dolar gösterimini tavsiye ederim, bunun yerine backticks:test $(($(date +%j) % 2)) == 0 && command
caligari

% J'nin Jülyen tarihi olmadığını gözden geçirdim, bu nedenle Yeni Yıl geçişinden kaçınan en iyi kod saniye cinsinden hesaplanmalıdır:test $(($(date +%s) / 86400 % 2)) == 0 && command
caligari

Yorumlarınız için teşekkürler! Önerimiz bir cazibe gibi bizim için çalıştı. Bu şemayı, her gün aynı sunucu kodunu paylaşan, farklı sunucu düğümlerinde çalıştıran, ama sadece bir tanesinde komut dosyasını çalıştırmaya izin veren komut dosyasını kullandık. Ancak, daha spesifik hale getirmemiz gerekirse, teklifinizi dikkate alacağız. Teşekkürler!!!
Jordi,

1

"Diğer" olup olmadığını her gün kontrol edelim :-) ( bcprogram gereklidir)

0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command

(Kodun doğru göründüğünden emin değilim. date +%sParça geri kesme arasındadır.)


Bu her geçen gün devam edecek ancak soruyu cevaplamıyor! Hala bazen tuhaf günlerde, bazen de aya bağlı günlerde bile çalışacaktır. Bu, sorudaki kodla aynı sonuca sahiptir, sadece dönemin başlamasından birkaç saniye sonra kendi matematiğinizi yaparak sonuca varıyorsunuz. Bu, dönemden bu yana bile birkaç gün, ancak takvimin günlerinde bile olmaz.
Caleb

1

Genel olarak, her gün çalıştırıp, bugün çalıştırılıp çalıştırılmayacağını belirlemek için betiğin mantığını kullanmasını istiyorum.

En son ne zaman çalıştığını söyleyen basit bir durum dosyası oluşturmak ve sonra eşleşmek çok kolay çalışacaktır.

Farklı kaynaklardan geçmesi gerekiyorsa, tartışmaya bağımlı hale getirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.