Cron'u damgalamadan nasıl koruyabilirim?


13

Diyelim ki her 15 dakikada bir çalışması gereken birkaç cron scriptim var. Onları çalıştırmak için ayarlayabilirdim */15 * * * *, ama sonra hepsi aynı anda koşuyor. Sunucunun birkaç dakika boyunca boşta durması ve aniden aynı anda bir düzine komut dosyası yürütmeye çalışması aptalca görünüyor.

1, 16, 31, 46 dakikada bir senaryoyu ve 2, 17, 32, 47'de başka bir senaryoyu çalıştırmamın bir yolu var mı?

Başka bir deyişle, her komut dosyasının 15 dakikada bir çalışmasını istiyorum, ancak özellikle çeyrek saat işaretleri üzerinde çalıştıkları umurumda değil.

Yanıtlar:


7

Bunu olması gerekenden daha zor hale getiriyorsun. Hepsini noktalı virgülle ayırarak aynı satıra koyun:

*/15 * * * * command1 ; command 2 ; command 3

Çalışacak command1, bitmesini bekleyecek, sonra çalışacak command2, bitmesini bekleyecek vb.


15

Cron işinizi şu şekilde yaparsanız: 6-59/15 * * * *saat 6, 21, 36 ve 51 dakika sonra çalışır.

Bu, tüm cron sürümleriyle çalışmayabilir.


14

Tüm komut dosyalarını bir dizine koyabilir, diyelim /etc/cron.15mve sonra cron'u çalıştırabilirsiniz

*/15 * * * * run-parts /etc/cron.15m

Bu, run-partskomuta sahip olduğunuzu varsayar . En azından tüm Debian tabanlı sistemlerde bulunur. Belirtilen dizindeki yürütülebilir programların tümünü, liste sırayla birer birer çalıştırır.

Bu yöntemin bir dezavantajı, komut dosyalarından biri asılırsa, geri kalanların tümü beklenir ve yürütülmez. Hepsinin çalışma süresi 15 dakikadan fazlaysa, iş tekrar çalışmaya başlar ve çok sayıda işlem birikebilir.


run-partsFedora / Red Hat sistemlerinde de mevcuttur.
11:26

9

Bunu yapmanın en basit yolu, komutları istediğiniz zaman çalışacak şekilde el ile ayarlamaktır:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Veya otomatik olarak uygun crontab girdilerini (yazım hatalarından kaçınan) oluşturmak için bir komut dosyası yazabilirsiniz.

Bazı cron sürümleri (muhtemelen kullandığınız sürüm dahil) genişletilmiş bir sözdizimini kabul eder:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

0

Cron yapmaya çalıştığınız işte gerçekten iyi değil. Temelde 15 dakika uyuyan, komutu yürüten ve sonra döngüler yapan bir betik görevi gören bir komut dosyası yazmayı düşündünüz mü?


1
Bununla ilgili birkaç potansiyel sorun var. Birincisi, sleep 300komutun her yürütülmesi arasında yaparsanız , komutun kendi yürütülmesi zamanın kaymasına neden olur; her 15:00 yerine her 15:10'da çalışabilir. Arka plan işlemi ölürse veya sistem yeniden başlatılırsa aksine crond, otomatik olarak yeniden başlamaz. Bir arka plan sürecini "arka plan sürecinden geçirmenin" yolları vardır, ancak o zaman hemen hemen yeniden uygularsınız crond.
Keith Thompson

Evet, bunun mükemmel bir çözüm olmadığına katılıyorum (her zaman & ile işi arka planda tutabilirsiniz), ama işte gidiyorsunuz.
Matt Simmons

1
Bunun yerine, cron'un tüm komutlarınızı sırayla yürüten tek bir komut dosyasını çalıştırmasını sağlayın. Aslında, run-partsözellikle bunu yapmak için çoğu cron kurulumuyla birlikte gelen standart bir komut dosyası olması çok yaygın bir ihtiyaçtır . @ AndrewSchulman'ın cevabına bakınız.
tylerl

0

Birçok dağıtımda /etc/cron.d/cronhourly bulunur ve bunun için içindeki tüm komut dosyaları saatlik olarak çalıştırılır. Sırayı 01scriptA 02scriptB gibi sıralı sayılarla başlatarak bile belirtebilirsiniz - Smoothwall'un linux dağıtım tabanında dediğimiz gibi zaten bir "cronhourlybyfour" üretmek zorunda olduğunuz cron bilgisi ile önemsiz olmalıdır :)

Uyarı kelimesi: Bu, daha önce önerildiği gibi çalışma parçalarını kullanır ve çalışma parçaları, a. adında, "deletehomefolders.sh" deme, "01deletehomefolders" deyin ve doğru # ile başladığınızdan emin olun! komut dosyanızı yorumlamak istediğiniz her şey için bir satır.

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.