Bir kök cron işi nasıl düzgün bir şekilde kurulur?


35

Bash betiğini root olarak çalıştırmak için her ayın 7,37'sinde, her ayın her saatinde, ayın her ayında her ay, her ay bir kök cron işi kurmaya çalıştım. Bu komut dosyası içinde bulunur /usr/binve adlandırılır tunlrupdate.sh. Tunlr'ın DNS'ini 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 betiği burada mevcuttur .

Çağrıldığında, komut dosyası içinde bulunan bir günlükte neler olduğunu yazar. /var/log/tunlr.log

Bu root cron job'unu eklemek için root'un crontab standardını kullandım.

sudo crontab -e

Ve sonunda bu 2 satırı ekledik. Cron'un betiği root olarak çalıştırmasını bekliyorum.

# 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 sonraki bir komut sudo crontab -l, cron işinin eklendiğini onayladı.

Ubuntu'yu yeniden başlattım ve cron işi düzgün bir şekilde başlatılıp başlatılmadığını günlük dosyasında kontrol ediyordum. Ancak, günlük dosyasında /var/log/tunlr.logişin başarıyla başlatılmadığı anlamına gelen hiçbir şey yoktur .

Komut dosyasını komut satırından çalıştırıp çalıştırmadığımı kontrol ettim

sudo /usr/bin/tunlrupdate.sh

daha sonra logfile buna göre güncellenir.

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

GÜNCELLEME 1: Şimdiye kadar önerilen tüm çözümler çalışmıyor. CLI'ye sistem günlüğünü listelemesi için teşekkür ederim sudo grep CRON /var/log/syslog. Ancak bir CRON hatası aldın

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 ile = komut dosyasındaki işlevler için kökten mutlak yolun eklenmesi ve kullanılması veya burada önerilen çözümler olmadan. Hala bu hatayı alıyorum.

Bazı aramalardan sonra /usr/lib/php5/maxlifetime, burada açıklandığı şekilde dosyadaki hatayı saptadım :Change #!/bin/sh -e --> #!/bin/sh -x

Sonra sistemimde CRON hata günlüğünü 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)

Hala bash betiğini çalıştırmıyorum. Bu kez kayıtta hiçbir hata gösterilmez. Güvence almak için bu betiğin içeriği değildi. Betiği şu 3 satıra indirdim:

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

Hala cron işinden geçemiyorum. Günlük dosyasına hiçbir şey yazılmıyor. Yani boş bir komut dosyası bile cronda çalışmayacak mı? Anlamadım. Bu 2 satıra indirgenmiş bir komut dosyası kullanmayı biliyorum:

#!/bin/bash
exit 0

Ve hala aynı hata günlüğü. Cron senaryosu geçmiyor ...


"Kök" bir cronjob olmak istiyorsan, root olmalısın, sonra crontab -e yaz. Ayrıca root olarak giriş yapmalısınız (konsol tipi "su root") ve sonra crontab -e (bu durumda sudo gerekli değildir).
Wolfgang

İyi. Cevabın konusunu anlamıyorum? $ Sudo crontab -e yazarken, $ sudo crontab -l tarafından bildirildiği gibi iş yapıldı, yani yeni işi tanımlayan satır kökün cronuna eklendi. Başına göre, iş kullanıcı cron'unda mevcut değil, örneğin $ crontab - l burada herhangi bir cron işi eklendiğini göstermiyor.
Antonio

@WolfgangVogl, beklendiği gibi çalışan "sudo" yu kullandı.
Alexis Wilke

Yanıtlar:


68

Bir betiği normal bir kullanıcı olarak çalıştırmak istiyorsanız :

crontab -e

Ve satırı ekleyin:

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

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

sudo crontab -e

Ve aynı satırı ekleyin:

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

@NineCattoRules Çıktıyı düşürmezseniz ne görüyorsunuz?
Angelo Fuchs

@AngeloFuchs eski yorum ... kesinlikle bu komutu ( sudo crontab -eyerine crontab -e) kök olarak denedim . Ya da başka bir şey, yine de işe yarıyor
NineCattoRules

10

Nihayet, çalışma çözümü. Sistem günlüğünde tekrarlayan ve merak uyandıran şeyleri gördüm:

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

Kök gibi sesler cmd olarak tanınmıyordu. Kök cronunu zaten kullandığım gibi $ sudo /usr/bin/tunlrupdate.sh. Daha sonra orjinal senaryo ile denedim (UNIX cmd tarihindeki bir hata için düzeltildi:% m olan ay olan% m,% M olan dakikalar için kullanıldı):

$ 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

Bu nihai çözüm olduğu ortaya çıktı. [Her ne kadar ben cron çizgisinde kök ile hatalı çizgiyi belirten literatür puanları buldum. O bir hataydı].


İyi nokta Olli. Bu konuda sana katılıyorum. Başvuru için kullanıcı crontab / var / spool / cron / crontabs / kullanıcı adı veya root / var / spool / cron / crontabs / root'ta saklanır. Bu sayfaya bakın askubuntu.com/questions/216692/where-is-the-user-crontab-stored İçeren klasör zaten mevcut ve kullanıcının adını veriyor.
Antonio

Eh, bu bilgiye ihtiyaç duymamalısınız, çünkü yalnızca crontab dosyalarını crontabkomut ile düzenlemelisiniz (altındaki crontab dosyaları hariç /etc).
Olli

1
@Antonio, kullanıcı adı alanına sahip puanlar yalnızca /etc/crontab(sistem genelinde crontab) kullanılır. Kullanılması sudo crontab -esize genellikle bulunabilir root crontab beraberler çalışma/var/spool/cron/crontabs
Matijs

2

Cron'la ilgili bir "sorun", çevre değişkenlerinin eksikliği ( bariz güvenlik nedenlerinden dolayı). Muhtemelen PATH ve HOME'u kaçırıyorsunuz. Bunları doğrudan komut dosyasında 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

Gerekli tüm değişkenleri betiğin gerektirdiği şekilde tanımlayana kadar test etmeniz gerekir.


1
Bu benim için gerçekten işe yarayan tek cevap bu. SHELL ve PATH deyimlerini /etc/crontabdosyadan kopyaladım ve bunları yapıştırdım sudo crontab -eve komut kök olmadan çalıştı. Teşekkür ederim!
Terrance

0

Cron hata mesajları genellikle - varsayılan olarak - e-posta ile gönderilir. Kök için e-posta olup olmadığını sudo mailveya /var/mail/rootörneğin içeriğini kontrol ederek kontrol edebilirsiniz.sudo less /var/mail/root .


E-posta mesajları yardımcı olmazsa, /var/log/syslogşunları da kontrol edin :

sudo grep CRON /var/log/syslog

Alexis Wilke'nin daha önce de söylediği gibi cron, ortam değişkenlerini ayarlamak için farklı mekanizmalara sahip.

Komut dosyanızın ihtiyacı var

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

crontab'a. HOMEgerekli olmamalı. Kodlarınızda mutlak yollar kullanmalısınız, örneğin /bin/datebunun yerine date. which command_nameÖrneğin her komut için uygun yolları bulabilirsiniz.

$ which date
/bin/date

Önerilen grep CRON'unuzu / var / log / syslog'da çalıştırıyorum aldatmacaya başladım Şub 11 14:37:01 Marius-PC CRON [7826]: (root) CMD (root / usr/bin/tunlrupdate.sh) 11 Şubat 14: 37:01 Marius-PC CRON [7825]: (root) POSTA (1 byte çıkış gönderilir; ancak 0x00ff, # 012 şeklinde çıktı) Şubat 11 14:39:01 Marius-PC CRON [7849]: (kök) CMD ( [-x / usr / lib / php5 / maksimum kullanım süresi] && [-d / var / lib / php5] && / / bulun / lib / php5 / -depth -mindepth 1 / lib / php5 / maxlifetime)! -execdir fuser -s {} 2> / dev / null \; -delete) Eğer cron içindeki PATH için bir tanım eklersem, bunlar sistemimi $ PATH etkilemeyecek mi?
Antonio,

Bu çıktı bir şeyi e-postayla göndermeye çalıştığını ancak başarısız olduğunu söylüyor. Bu, o hata mesajını alamayacağınız anlamına gelir /var/mail/root. Bunu düzeltebilir veya deneyebilirsinizPATH=...
Olli

@Antonio, alternatif olarak, bu yamalı sürümü
Olli

Teşekkürler. Sistem e-postasını yapılandırmadığımı ve bunun olmadığının farkında olduğunu biliyorum. Komut dosyasını, çağrılan herhangi bir işlev için mutlak yolu kullanacak şekilde değiştirmiştim. Son şey, önceki sorum oldu crontab içindeki bir PATH tanımı sistemimi $ PATH değişkenine karıştırmayacaktı?
Antonio,

1
Bu arada, tarih biçimindeki bir hatayı orijinal komut dosyasından düzeltmekle meşguldüm. % M yerine% m (ay değil dakika için) kullanıyordu ...
Antonio

0

Bu satırı betiğinize ekleyebilirsiniz. Yani cron kayıtlarını kontrol ettikten ve işinizi yürüttükten sonra kontrol ettikten sonra, crontab'ların sahip olduğu aynı PATH $ 'ı elde edebilirsiniz.

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

Muhtemelen cron betiklerinde sorunları teşhis etmek için yapabileceğiniz en iyi şey, betiğinizde env komutuyla birlikte SO'nun tüm ortam değişkenlerini elde etmektir. Bu yüzden sadece bu satırı scriptinize ekleyin. O zaman çıktıyı analiz edebilirsiniz.allEvnVars.txt

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

Diğer bir püf noktası, betiğin çıktısını bir yere yönlendirmektir. Ekleyerek /root/log.log. Bu şekilde betiğin tüm çıktısı korunur/root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

Ayrıca betiği, testleri ve kontrolleri kolaylaştırmak için her dakikayı çalıştırmak üzere programlayabilirsiniz.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log
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.