Nasıl düzgün bir kök cron iş kurmak

22

Kök olarak bir Bash komut dosyasını çalıştırmak için, her ay, her ay, her ay, her saat, 7,37'de çalışmak üzere bir root cron işi kurmaya çalıştım. Bu komut dosyası /usr/bin dizininde ve tunlrupdate.sh olarak adlandırılmıştır. Tunlr'ın DNS'sini günceller.

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

Bu Bash komut dosyası buradan kullanılabilir.

Çağrıldığında, komut dosyası /var/log/tunlr.log

adresinde bulunan bir günlüğünde neler olduğunu yazıyor

Bu root cron işini eklemek için root'un crontab standardını kullandım

sudo crontab -e

Ve bu 2 çizgiyi sonuna ekledim. Cron'un betiği root olarak çalıştırmasını beklerim.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

Daha sonra% co_de komutu, cron işinin eklendiğini doğruladı.

Ubuntu'yu yeniden başlattım ve eğer cron işi düzgün bir şekilde başlatılmışsa günlük dosyasına baktım. Bununla birlikte, sudo crontab -l günlük dosyasında, işin hiçbir zaman başarılı bir şekilde başlatılmadığı anlamına gelen hiçbir şey yoktur.

Komut dosyasını komut satırından çalıştırırsam

kontrol ettim
sudo /usr/bin/tunlrupdate.sh

sonra, günlük dosyası buna göre güncellenir.

Neden bu cron işi sistemimde planlandığı gibi çalışmıyor?

GÜNCELLEME 1: Şimdiye kadar önerilen tüm çözümler işe yaramıyor. Sistem kütüğünü /var/log/tunlr.log listelemek için CLI için teşekkür ederim. Ancak bir CRON hatası aldım

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

önerilen PATH = ekleme & amp; komut dosyasındaki işlevler için veya bu önerilen çözümler olmaksızın kökten mutlak yolun kullanılması. Hala bu hatayı alıyorum.

Bazı aramalardan sonra hatayı sudo grep CRON /var/log/syslog dosyasında açıklandığı gibi saptadım. buradan : /usr/lib/php5/maxlifetime

Ardından CRON hata günlüğünü sistemimde listeleme

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

Halen bash komut dosyasını çalıştırmıyorum. Bu sefer kayıtta hiçbir hata gösterilmiyor. Güvence almak için bu betiğin içeriği değildi. Komut dosyasını aşağıdaki 3 satıra indirdim:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

Hala cron işini yapamıyorum. Günlük dosyasına hiçbir şey yazılmaz. Yani boş bir betik bile cronda çalışmayacak mı? Anlamadım. Bu 2 satıra indirgenmiş bir senaryoyu denemeyi biliyorum:

#!/bin/bash
exit 0

Ve hala aynı hata kaydı. Cron betiği gitmiyor ...

    
sordu Antonio 11.02.2014 19:01

5 cevap

7

Eh, sonunda çalışma çözümü. Syslog'da tekrarlayan ve merak uyandıranları gördüm:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

Kökün bir cmd olarak tanınmaması gibi görünüyor. Kökün cronunu zaten $ sudo /usr/bin/tunlrupdate.sh kullanarak kullandım. Sonra orijinal betikle denedim (UNIX cmd'de bir hata için düzeltildi:% m olan ay% M olan dakikalar için kullanıldı) (aşağıdaki kodu cron satırından kaldırır):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

Bunun nihai çözüm olduğu ortaya çıktı. [Bununla birlikte, cron hattında hatalı olan hatalı çizgiyi belirten literatür puanları buldum. Bu bir hataydı.

    
verilen cevap Antonio 12.02.2014 02:12
51

Bir komut dosyasını normal kullanıcı olarak çalıştırmak istiyorsanız:

crontab -e

Ve satırı ekleyin:

07,37 * * * * /usr/bin/tunlrupdate.sh

Komut dosyanızı root olarak çalıştırmak istiyorsanız:

sudo crontab -e

Ve aynı satırı ekleyin:

07,37 * * * * /usr/bin/tunlrupdate.sh
    
verilen cevap Guillaume 26.09.2014 14:01
2

Cron ile bir "problem", ortam değişkenlerinin eksikliğidir ( bariz güvenlik nedenleri için). Muhtemelen PATH ve HOME'u kaçırıyorsunuz. Komut dosyasındakileri doğrudan veya crontab dosyasında tanımlayabilirsiniz.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

Komut dosyasının gerektirdiği tüm gerekli değişkenler tanımlanana kadar test etmeniz gerekir.

    
verilen cevap Alexis Wilke 11.02.2014 19:47
0

Cron hata iletileri genellikle - varsayılan olarak - e-posta ile gönderilir. Kök için sudo mail ile veya yalnızca /var/mail/root içeriğini kontrol ederek, ör.% Co_de% 'yi kontrol edebilirsiniz.

E-posta mesajları yardımcı olmazsa, sudo less /var/mail/root 'yı da kontrol edin:

sudo grep CRON /var/log/syslog

Alexis Wilke'nin dediği gibi, cron ortam değişkenlerini belirlemek için farklı mekanizmalara sahiptir.

Komut dosyanızın gereksinimleri

PATH=/sbin:/bin:/usr/bin

crontab'a. /var/log/syslog gerekli olmamalıdır. Komut dosyalarınızdaki mutlak yolları kullanmalısınız, ör.% Co_de% yerine HOME . Her komut için /bin/date ile uygun yolları bulabilirsiniz, ör.

$ which date
/bin/date
    
verilen cevap Olli 11.02.2014 20:09
0

Bu satırı komut dosyanıza ekleyebilirsiniz. Böylece, cron kayıtlarını kontrol ettikten ve işini yürüttükten sonra, crontabs'ların aynı $ PATH'ını alabilirsiniz.

/bin/echo $PATH > /root/path.txt

Muhtemelen, cron betiklerindeki sorunları teşhis etmek için yapabileceğiniz en iyi şey, komut dosyanızdaki env komutuyla SO'nun tüm ortam değişkenlerini elde etmektir. Bu satırı sadece komut dosyasına ekleyin. Ardından çıktıyı allEvnVars.txt

analiz edebilirsiniz.
/usr/bin/env > /root/allEvnVars.txt

Başka bir hile, komut dosyasının çıktısını bir yere yönlendirmektir. % Co_de% dosyası ekleniyor. Bu şekilde, komut dosyasının tüm çıktıları /root/log.log

içinde korunacaktır.
07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

Ayrıca, testi ve kontrolleri kolaylaştırmak için komut dosyasını her bir dakika çalışacak şekilde de zamanlayabilirsiniz.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log
    
verilen cevap Cassio Seffrin 01.06.2015 03:54

Etiketlerdeki diğer soruları oku