Soru Neden crontab'ım çalışmıyor ve nasıl giderebilirim?


Bu bir Kanonik Soru cron & crontab kullanımı hakkında.

Buraya yönlendirildiniz çünkü topluluk, sorunun cevabının aşağıda bulunabileceğinden oldukça emin. Sorunuz aşağıda yanıtlanmamışsa, cevaplar topluluğun size yardım etmesine yardımcı olacak bilgileri toplamanıza yardımcı olacaktır. Bu bilgi orijinal sorunuza göre düzenlenmelidir.

'İçin cevapNeden crontab'ım çalışmıyor ve nasıl giderebilirim?'aşağıda görülebilir. Bu adresleri cron crontab ile vurgulanan sistem.


193
2017-11-17 04:51


Menşei


Bu büyük bir çift Crontab'ın çalışmadığı nedenler AskUbuntu üzerinde. - Dan Dascalescu


Cevaplar:


Tüm crontab ile ilgili sorunlar / problemler nasıl giderilir (Linux)


Bu bir topluluk wikiBu cevapla yanlış bir şey fark ederseniz veya ek bilgi varsa, lütfen bunu düzenleyin.


İlk olarak, temel terminoloji:

  • cron (8) Zamanlanmış komutları yürüten bir programdır.
  • crontab'ın (1) kullanıcı crontab (5) dosyalarını değiştirmek için kullanılan programdır.
  • crontab'ın (5) cron (8) için talimatlar içeren bir kullanıcı dosyasıdır.

Sonraki, cron hakkında eğitim:

Bir sistemdeki her kullanıcının kendi crontab dosyası olabilir. Kök ve kullanıcı crontab dosyalarının konumu sisteme bağlıdır, ancak genellikle aşağıdadır /var/spool/cron.

Sistem çapında /etc/crontab dosya, /etc/cron.d dizin ayrıca cron tarafından okunan ve harekete geçirilen crontab fragmanlarını içerebilir. Bazı Linux dağıtımları (örneğin, Red Hat) da var /etc/cron.{hourly,daily,weekly,monthly} dizinler, içinde her saat / gün / hafta / ay olacak betikler kök ayrıcalığı ile.

kök her zaman crontab komutunu kullanabilir; düzenli kullanıcılar erişebilir veya verilmeyebilir. Crontab dosyasını komutla düzenlediğinizde crontab -e ve kaydedin, crond temel geçerlilik için kontrol eder, ancak crontab dosyanızın doğru şekilde oluşturulduğunu garanti etmez. Adında bir dosya var cron.deny hangi kullanıcıların cron kullanamayacağını belirleyecektir. cron.deny dosya konumu sisteme bağlıdır ve tüm kullanıcıların cron kullanmasına izin veren silinebilir.

Bilgisayar açılmamışsa veya crond daemon çalışmıyorsa ve çalıştırılacak bir komutun tarih / saati geçtiyse, crond geçmiş sorguları yakalamaz ve çalıştırmaz.

crontab detayları, nasıl bir komut formüle edilir:

Bir crontab komutu tek bir satır ile temsil edilir. Kullanamazsın \ bir komutun birden fazla satıra genişletilmesi. Karma (#) işareti, bu satırdaki herhangi bir şeyin cron tarafından yok sayıldığı bir yorumu temsil eder. Lider boşluk ve boş satırlar göz ardı edilir.

Yüzdeyi kullanırken çok dikkatli olun (%) emrinizde oturum açın. Kaçmadıkça \% ilk kaçıştan sonra yeni satırlara ve her şeye dönüştürülürler % Stdin'de emrinize geçilir.

Crontab dosyaları için iki format vardır:

  • Kullanıcı crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
  • Geniş sistem /etc/crontab ve /etc/cron.d fragmanları

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    

İkincisinin bir kullanıcı adı gerektirdiğine dikkat edin. Komut, adlandırılmış kullanıcı olarak çalıştırılacaktır.

Çizginin ilk 5 alanı, komutun çalıştırılması gereken zamanı (zamanı) temsil eder. Zaman belirtiminde sayıları veya geçerli gün / ay adlarını kullanabilirsiniz.

  • Alanlar boşluk veya sekme ile ayrılır.
  • Bir virgül (,) bir listeyi belirtmek için kullanılır, örneğin 1,4,6,8'de çalıştırılan anlamına gelen 1,4,6,8'dir.
  • Aralıklar bir tire ile belirtilir (-) ve listelerle birleştirilebilir, örn. 1-3,9-12, 1 ile 3 arasında, daha sonra 9 ile 12 arasında.
  • / karakter, örneğin bir adımı tanıtmak için kullanılabilir. 2/5 Yani her 5'de başlayan (5, 7, 12, 17, 22 ...). Sonunu bitirmezler.
  • Yıldız işareti (*) bir alanda, o alan için tüm aralığı belirtir (ör. 0-59 dakika alanı için).
  • Aralıklar ve adımlar, örn. */2 ilgili alan için minimumdan başlayarak her 2 0 dakika (0,2 ... 58), 1 ay boyunca (1,3 ... 11) vb.

Hata ayıklama cron komutları

Postayı kontrol et! Varsayılan olarak cron, komuttan herhangi bir çıkışı komut olarak çalıştırdığı kullanıcıya gönderir. Eğer çıktı yoksa, posta olmaz. Eğer cronun farklı bir hesaba posta göndermesini isterseniz, MAILTO ortam değişkenini crontab dosyasında ör.

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

Çıktıyı kendin yakala

1 2 * * *  /path/to/your/command &>/tmp/mycommand.log

/tmp/mycommand.log dosyasına stdout ve stderr yazıyor

Günlüklere bak; cron eylemlerini syslog ile günlüğe kaydeder (kurulumunuza bağlı olarak). /var/log/cron veya /var/log/syslog.

Gerekirse, cron ifadelerini ör.

grep CRON /var/log/syslog 

Şimdi, cron'un temellerini gözden geçirdik, dosyaların nerede olduğu ve bunları nasıl kullanacağımız bazı ortak problemlere bakalım.

Cronun çalıştığını kontrol et

Eğer cron çalışmıyorsa, komutlarınız programlanmayacak ...

ps -ef | grep cron | grep -v grep

sana bir şey almalı

root    1224   1  0 Nov16 ?    00:00:03 cron

veya

root    2018   1  0 Nov14 ?    00:00:06 crond

Eğer yeniden başlatmazsa

/sbin/service cron start

veya

/sbin/service crond start

Başka yöntemler de olabilir; dağıtımınızın ne yaptığını kullanın.

cron komutunuzu kısıtlı bir ortamda çalıştırır.

Hangi ortam değişkenlerinin mevcut olduğu oldukça sınırlıdır. Genellikle, yalnızca tanımlanmış birkaç değişkene sahip olursunuz. $LOGNAME, $HOME, ve $PATH.

Özellikle not PATH ile sınırlıdır /bin:/usr/bin. "Cron script'im çalışmıyor" sorunlarının büyük çoğunluğu bu kısıtlayıcı yoldan kaynaklanıyor. Komutunuz farklı bir konumda ise, bunu birkaç şekilde çözebilirsiniz:

  1. Komutunuza tam yolu sağlayın.

    1 2 * * * /path/to/your/command
    
  2. Crontab dosyasında uygun bir PATH sağlayın

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

Komutunuz başka ortam değişkenleri gerektiriyorsa, bunları da crontab dosyasında tanımlayabilirsiniz.

cron, cwd == $ HOME ile komutunuzu çalıştırır

Yürütülmekte olduğunuz programın dosya sisteminde nerede olduğuna bakılmaksızın, cron çalıştıran programın güncel çalışma dizini kullanıcının ev dizini. Programınızdaki dosyalara erişirseniz, göreceli yolları kullanırsanız veya (tercihen) her yerde tam nitelikli yollar kullanırsanız ve herkese bir sürü karışıklık kazandırırsanız, bunu hesaba katmanız gerekir.

Crontab'ımdaki son komut çalışmıyor

Cron genellikle, komutların yeni bir satırla sonlandırılmasını gerektirir. Crontab'ınızı düzenleyin; Son komutu içeren satırın sonuna gidin ve yeni bir satır ekleyin (enter tuşuna basın).

Crontab formatını kontrol et

/ Etc / crontab için bir kullanıcı crontab formatlı crontab veya /etc/cron.d içindeki fragmanları ve tersini kullanamazsınız. Bir kullanıcı biçimlendirilmiş crontab, bir satırın 6. konumunda bir kullanıcı adı içermez, bir sistem biçimli crontab kullanıcı adını içerir ve komutu bu kullanıcı olarak çalıştırır.

/Etc/cron.{hourly,daily.weekly,monthly} bir dosya koydum ve çalışmıyor

  • Dosya adının bir uzantısının olmadığını kontrol edin -Parçaları çalıştırmak
  • Dosyanın yürütme izinlerinin olduğundan emin olun.
  • Komut dosyanızı yürütürken sisteme ne kullanacağınızı söyleyin (örn. #!/bin/sh zirvede)

Cron tarihiyle ilgili hatalar

Tarihiniz yakın zamanda bir kullanıcı veya sistem güncellemesi, saat dilimi veya başka bir kişi tarafından değiştirilirse, crontab düzensiz davranmaya ve bazen de bazen çalışmayan tuhaf hatalar göstermeye başlar. Bu, crontab'ın zamanın altından değiştiği zaman "istediğini yap" denemeye çalışmasıdır. Saat değiştikten sonra "dakika" alanı etkisiz hale gelecektir. Bu senaryoda sadece yıldız işaretleri kabul edilecektir. Cron'u yeniden başlatın ve internete bağlanmadan tekrar deneyin (böylece tarihin saat sunucularından birine sıfırlama şansı yoktur).

Yüzde işaretler yine

Yüzde işaretleriyle ilgili tavsiyeyi vurgulamak için, cron'un bunlarla ne yaptığının bir örneği:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

3 satırı içeren ~ / cron.out dosyasını oluşturacak

foo
bar
baz

Bu özellikle kullanırken müdahaleci date Komut. Yüzde işaretleri kaçmak için emin olun

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

274
2017-10-09 15:29



Ayrıca, LD_LIBRARY_PATH'ın, paylaşılan kütüphaneleri bulamaması nedeniyle, cron görevinizin başarısız olması durumunda ayarlanmış herhangi bir ek klasöre sahip olması gerektiği 'kısıtlanmış env' bölümünde de bahsetmek isteyebilirsiniz. - DavidJ
bunun gibi bir şey yazabileceğinizi unutmayın: 35 1,5-23 / 2 * * * 35,1,5,7,9 yerine do_something, .. * * * Buna ek olarak crontab.guru Yaptığınız girdileri insan diline çevirir. - Dennis Nolte
Çıkış yakalama benim için çalışmaz, sh kabuğu nedeniyle olabilir. Bence bu daha taşınabilir: ... /path/to/your/command >/tmp/mycommand.log 2>&1 - chus
Bu benim için çalıştı: sudo apt-get install postfix - jmunsch
cron işi ayrıca dosyanın ne kadar ağır olduğuna da bağlıdır? Çünkü ben cron ile python'da basit bir merhaba dünyasını koştum, işe yaradı. Ama ikinci kod biraz ağırdı ve normalde koşuyor ama cron ile dosyaya herhangi bir çıktı vermiyor. - Devendra Bhat


Eğer cronjobs çalışmayı durdurursa, şifrenizin zaman aşımına uğramamış olup olmadığını kontrol edin, çünkü sahip olduğu zaman, tüm cron işleri durur.
İçinde mesajlar olacak /var/log/messages aşağıdakine benzer olan, kullanıcının kimliğini doğrulamakla ilgili sorunları gösterir:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)


18
2018-02-04 20:29



Sadece bunu da aldım (hata mesajı dosya / var / log / syslog benim için). Benim durumumda, oluşturma zamanında root parolasını (isteğe bağlı olarak) başka bir tanesine sıfırlar ve görünüşe göre oraya gidip değiştirene kadar tüm cron işleri çalışmaz. Aylak. Düzeltmek gibi bir şey sudo -u root passwd - rogerdpack


Debian Linux ve türevleri (Ubuntu, Nane, vb.), Cron işlerinin yürütülmesini engelleyecek bazı özelliklere sahiptir; özellikle, içindeki dosyalar /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly} gerekir:

  • köke ait olmak
  • sadece root tarafından yazılabilir
  • grup veya diğer kullanıcılar tarafından yazılabilir değil
  • bir ismin var herhangi bir nokta olmadan. veya başka bir özel karakter ancak '-' ve '_'.

Sonuncusu düzenli olmayan kullanıcılara acıyor; özellikle bu klasörlerdeki herhangi bir betik whatever.sh, mycron.py, testfile.plvb. değil hiç infaz edilmek.

Tecrübemde bu özel nokta, Debian ve türevleri üzerinde yürütmeyen bir cronjob için en sık görülen neden olmuştur.

Görmek man cron gerekirse daha fazla bilgi için.


15
2017-11-17 14:37





Yaygın ve düzensiz çizelgeler

Cron her şey çok basit bir programcı olarak kabul edilir ve sözdizimi bir yöneticinin biraz daha nadir zaman çizelgeleri oluşturmasına izin vermez.

Genel olarak açıklanacak olan aşağıdaki işi düşünün "koşmak command her 5 dakikada bir ":

*/5 * * * * /path/to/your/command

karşı:

*/7 * * * * /path/to/your/command

hangi değil her zaman koşmak command her 7 dakikada bir.

Unutmayın ki / Bir adımı tanıtmak için karakter kullanılabilir, ancak bu adımlar bir dizinin sonunun ötesine sarılmaz. */7 Dakikadan her 7 dakikada bir eşleşen 0-59  yani 0,7,14,21,28,35,42,49,56 ama bir saat ile bir sonraki olacak gruplar arasında sadece 4 dakikasonra 00:56 yeni bir dizi başlar 01:00, 01:07 vb (ve gruplar çalışmayacak 01:03 , 01:10 , 01:17 vb.).


Bunun yerine ne yapmalı?

Birden çok toplu oluşturma

Tek bir cron işi yerine, istenen programla bir araya getirilen çoklu gruplar oluşturun.

Örneğin, her 40 dakikada bir (00:00, 00:40, 01:20, 02:00 vb.) Bir parti çalıştırmak için, iki saatlik, hatta iki saatte çalışan ve ikincisi yalnızca tek bir saat çalıştıran iki grup oluşturun:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

Parti gruplarınızı daha az çalıştırın 

Partinizi her 7 dakikada bir çalıştırmak yerine, birden fazla parti halinde ayrılması zor bir programdır, bunun yerine her 10 dakikada bir çalıştırın.

Parti gruplarınızı daha sık çalıştırın 

Birçok tekli çizelge evrimleşiyor çünkü parti çalışma süreleri artar / dalgalanır ve daha sonra, aynı partinin müteakip seferlerini eşzamanlı olarak üst üste binmesini ve çalışmasını önlemek için gruplar ek güvenlik marjı ile programlanırlar.

Bunun yerine, farklı bir düşünün ve daha önceki bir çalışma henüz bitmedi, ancak aksi takdirde çalışacak bir incelikle başarısız olacak bir cronjob oluşturun. Bunu gör S & C:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job --minutely

Benzer bir notta, son başarılı çalışmanın zaman damgasını toplu olarak ve toplu işlerin başlangıcında, toplu iş grupları arasındaki istenen aralığın zaten geçip geçmediğini ve aksi takdirde düzgün bir şekilde çıkıp çıkmadığını kaydedebilirsiniz.

Bash seven-minute-job şöyle bir şey gibi görünecekti:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
    echo "The minimum interval of 7 minutes between successive batches hasn't passed yet."
    exit
fi

echo "Start running your batch"

date > /tmp/lastrun

Daha sonra her dakikayı koşmak için güvenli bir şekilde (girişimde) yapabilirsiniz:

* * * * * /path/to/your/seven-minute-job

Cron kullanmayın

İhtiyaçlarınız karmaşıksa, karmaşık programları (birden fazla sunucuya dağıtılmış) çalıştırmak için tasarlanan ve tetikleyicileri, iş bağımlılıklarını, hata işleme, yeniden deneme izlemeyi vb. Destekleyen daha gelişmiş bir ürünü kullanmayı düşünebilirsiniz. iş planlaması ve / veya "iş yükü otomasyonu".


10
2017-10-23 04:45





PHP özgü

Gibi cron iş varsa:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

Ve hataların olması durumunda, size gönderilecekler, ama değil - bunu kontrol et.

PHP varsayılan olarak STDOUT'a hata göndermiyor. @görmek https://bugs.php.net/bug.php?id=22839

Bunu düzeltmek için, cli`s php.ini dosyasında veya satırınızda (ya da PHP'nin bash paketleyicisinde) şunları ekleyin:

  • --define display_startup_errors = 1
  • --define display_errors = 'stderr'

1. ayar, 'Memory oops' ve 2nd gibi hatalar yapmanıza izin verir - hepsini STDERR'ye yönlendirir. Sadece iyi uyuyabildiğinizden sonra, sadece günlüğe kaydedilenler yerine rootunuzun postasına gönderilecektir.


8



Bu hata raporu, 2007'de PHP 5.2+ şubelerine eklenen yama durumuyla kapatıldı. Bunun gerekli olduğundan emin misin? Ben sadece 5.4 PHP üzerinde çalıştı ve iyi çalışıyor gibi görünüyor. (Yine de PHP 4 için hala gereklidir). - Xeoncross
@Xeoncross cevabın tarihini gör :) - gaRex
Evet, 2013'te cevap verdiğinizden beri kafam karıştı ve bilet '07'ye geri döndü. - Xeoncross