Tüm crontab ile ilgili sıkıntılarınızı / problemlerinizi nasıl çözersiniz (Linux)
Bu bir topluluk wiki , bu cevapta yanlış bir şey fark ederseniz veya ek bilgiye sahipseniz, lütfen düzenleyin.
İlk olarak, temel terminoloji:
- cron (8) , zamanlanmış komutları yerine getiren servistir.
- crontab (1) , kullanıcı crontab (5) dosyalarını değiştirmek için kullanılan programdır.
- crontab (5) , cron (8) ile ilgili talimatları içeren kullanıcı başına bir dosyadır.
Sonra, 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 bunlar genellikle aşağıdadır /var/spool/cron
.
Sistem çapında bir /etc/crontab
dosya var, /etc/cron.d
dizin cron tarafından da okunan ve harekete geçirilen crontab parçalarını içerebilir. Bazı Linux dağıtımları (örn. Red Hat) ayrıca /etc/cron.{hourly,daily,weekly,monthly}
dizinler, içinde her saat / gün / hafta / ay içinde yürütülecek komut dosyaları ve kök ayrıcalıklara sahiptir.
root her zaman crontab komutunu kullanabilir; Düzenli kullanıcılara erişim izni verilebilir veya verilmeyebilir. Crontab dosyasını komutla düzenleyip crontab -e
kaydettiğinizde, crond temel geçerliliğini kontrol eder, ancak crontab dosyanızın doğru şekilde oluşturulduğunu garanti etmez. cron.deny
Hangi kullanıcıların cron kullanamayacağını belirten bir dosya var . cron.deny
Dosya konumu sistemi bağlıdır ve tüm kullanıcılar cron'u kullanmanızı sağlayacak olan silinebilir.
Bilgisayar açılmazsa veya crond arka plan programı çalışmıyorsa ve çalıştırılacak bir komutun tarih / saati geçmişse, crond yakalamaz ve sorguları geçemez.
crontab details, nasıl bir komut formüle edileceği:
Bir crontab komutu, tek bir satır ile temsil edilir. \
Bir komutu birden çok satıra genişletmek için kullanamazsınız . Hash ( #
) işareti, bu satırdaki herhangi bir şeyin cron tarafından yok sayıldığı anlamına gelir. Önde gelen boşluk ve boş satırlar dikkate alınmaz.
%
Komutunuzdaki yüzde ( ) işaretini kullanırken ÇOK dikkatli olun . Kaçmadıkları sürece \%
yeni satırlara dönüştürülürler ve ilk kaçan olmayandan sonra her şey %
stdin komutuna geçirilir.
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
Sistem geneli /etc/crontab
ve /etc/cron.d
parçaları
# 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.
Satırın ilk 5 alanı komutun çalıştırılması gereken süreyi gösterir. Saat belirtiminde sayıları veya geçerli gün / ay adlarını kullanabilirsiniz.
- Alanlar boşluklarla veya sekmelerle ayrılır.
- Bir
,
listeyi belirtmek için virgül ( ) kullanılır; örneğin 1,4,6,8.
- Aralıklar bir tire (
-
) ile belirtilir ve listelerle birleştirilebilir, örn. 1-3,9-12, yani 1 ile 3 arasında, sonra 9 ile 12 arasında listeler.
/
Karakteri (... 2,7,12,17,22) daha sonra 2 de her 5 başlayacağı anlamına gelmektedir bir adım örneğin 2/5 tanıtmak için kullanılabilir. Sonunu geçmezler.
- Bir
*
alandaki yıldız ( ), o alanın tüm aralığını gösterir (örneğin 0-59
, dakika alanı için).
- Aralıklar ve adımlar birleştirilebilir, örneğin
*/2
ilgili alan için minimumdan başlayarak daha sonra her 2 örneğin 0 dakika (0,2 ... 58), aylar için 1 (1,3 ... 11) vb.
Hata ayıklama cron komutları
Postayı kontrol et!
Varsayılan olarak cron komuttan herhangi bir çıktıyı, komutu çalıştığı kullanıcıya postalar. Çıktı yoksa posta da olmaz. Eğer cron'un farklı bir hesaba posta göndermesini istiyorsanız, MAILTO ortam değişkenini crontab dosyasında ayarlayabilirsiniz;
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
Çıktıyı kendiniz yakalayın
Stdout ve stderr'yi bir dosyaya yönlendirebilirsiniz. Çıktı yakalama için tam sözdizimi, hangi kabuk cronunun kullandığına bağlı olarak değişebilir. İşte tüm çıktıları bir dosyaya kaydeden iki örnek /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
Günlüklere bak
Cron, eylemlerini syslog aracılığıyla kaydeder (bu, kurulumunuza bağlı olarak) genellikle /var/log/cron
veya üzerine gider /var/log/syslog
.
Gerekirse, cron ifadelerini örneğin ile filtreleyebilirsiniz.
grep CRON /var/log/syslog
Şimdi cronun temellerini, dosyaların nerede olduklarını ve nasıl kullanacağımızı gözden geçirdik, bazı ortak problemlere bakalım.
Cron'un ç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ıyım
root 1224 1 0 Nov16 ? 00:00:03 cron
veya
root 2018 1 0 Nov14 ? 00:00:06 crond
Yeniden başlatılmazsa
/sbin/service cron start
veya
/sbin/service crond start
Başka yöntemler de olabilir; dağıtımınızın sağladıklarını kullanın.
cron komutunuzu sınırlı bir ortamda çalıştırır.
Hangi ortam değişkenlerinin mevcut olduğu çok sınırlı olabilir. Genellikle, sadece böyle tanımlanan birkaç değişken, alırsınız $LOGNAME
, $HOME
ve $PATH
.
Belirli bir not PATH
ile sınırlıdır /bin:/usr/bin
. "Cron betiğ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ç yolla çözebilirsiniz:
Komutunuzun tam yolunu belirtin.
1 2 * * * /path/to/your/command
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, onları crontab dosyasında da tanımlayabilirsiniz.
cron komutunuzu cwd == $ HOME ile çalıştırır
Çalıştırdığınız programın dosya sisteminde nerede olduğuna bakılmaksızın, cron çalıştığında programın geçerli çalışma dizini kullanıcının ana dizini olacaktır . Programınızdaki dosyalara erişirseniz, göreceli yollar kullanıyorsanız veya (tercihen) sadece her yerde tam nitelikli yollar kullanıyorsanız ve herkesi çok fazla karışıklıktan kurtarıyorsanız, bunu dikkate almanı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 edin
/ Etc / crontab için bir kullanıcı crontab formatlı crontab'ı ya da /etc/cron.d içindeki parçalarını kullanamazsınız. Kullanıcı formatlı bir crontab, bir satırın 6. pozisyonunda bir kullanıcı adı içermezken, formatlanmış bir sistem kullanıcı adını içerir ve komutu bu kullanıcı olarak çalıştırır.
/Etc/cron.{hourly,daily, weekly,monthly} dosyasına bir dosya koydum ve çalışmadı
- Dosya adı uzantısı bkz olmadığını kontrol edin çalışma parçaları
- Dosyanın yürütme izinlerine sahip olduğundan emin olun.
- Komut dosyanızı yürütürken ne kullanacağınızı sisteme söyleyin (ör.
#!/bin/sh
En üste koyun )
Cron tarihiyle ilgili hatalar
Tarihiniz yakın zamanda bir kullanıcı veya sistem güncellemesi, saat dilimi veya benzeri bir tarihle değiştirilirse, crontab hatalı davranmaya başlar ve bazen işe yarayan bazen işe yaramaz, tuhaf hatalar sergileyecektir. Bu, crontab'ın zamanın altından sapmasıyla “istediğini yapmayı” denemesidir. Saat değiştikten sonra "dakika" alanı etkisiz hale gelecektir. Bu senaryoda, sadece yıldızlar kabul edilecektir. Cron'u yeniden başlatın ve internete bağlanmadan tekrar deneyin (böylece tarihin zaman sunucularından birine sıfırlama şansı yoktur).
Yine yüzde işaretleri
Yüzde işaretleri hakkındaki önerileri vurgulamak için, işte cron'un onlarla ne yaptığına bir örnek:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
3 satırı içeren ~ / cron.out dosyasını yaratacaktır
foo
bar
baz
Bu özellikle date
komutu kullanırken müdahalecidir . Yüzde işaretlerinden kaçtığınızdan emin olun.
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"