Bir cronjob'ı / dev / null / 'a nasıl tamamen sustururum?


72

Ubuntu-Desktop'ımda ve debian-server'ımda, her dakika çalıştırılması gereken bir betiğim var ( alanımın internet tarayıcısındaki dakikasını çağıran bir betik ).

Sorun debian türevlerinde cron'un /var/log/syslogher çalıştırışında günlüğe kaydetmesidir . Sonunda, tekrar tekrar yürütüldüğü mesajı tekrarlayan olarak görüyorum /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

Bir programın çıktısını bastırmak için yeniden yönlendirebileceğimi biliyorum /dev/null, örneğin bir programdaki tüm hata ve uyarı mesajlarını gizlemek için crontab'da böyle bir satır oluşturabileceğimi biliyorum

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

Ancak bir cronjob çalıştırmak ve üretilen tüm çıktıların veya hataların NULL'a aktarıldığından emin olmak istiyorum, böylece syslog'da herhangi bir ileti oluşturmaz ve herhangi bir e-posta oluşturmaz


EDIT:
cron-log'larını değiştirerek burada önerilen şekilde ayrı bir log'a yönlendirmek için bir çözüm var./etc/syslog.conf

Ancak dezavantajı, daha sonra tüm cronjobs'ların ALL çıktısının yönlendirilmesidir.

Her nasılsa, tek bir cronjob'ı ayrı bir günlük dosyasına yönlendirebilir miyim? Tercihen, cron.hourlydosyanın içinde yapılandırılabilir .


2
Ayrıca MAILTO=""cron dosyasının başına da koyabilirsiniz . Bu, tüm e-postaları bastırır. Ve syslog'a iş çıktısı gönderen bir cron daemonunu hiç duymadım (ama sanırım mümkün).
Patrick

@Patrick - Bu herşeyi devre dışı bırakacaktır, ki bu doğru olabilir, ama sadece farkında olun. Güncellememe bakın, birden fazla mAILTO's ayarlayabilirsiniz.
slm

Evet, MAILTO=""crontab'ın 1. satırı e-postaları engelleyeceğinden. Ayrıca, tüm çıktıları bastırıyorsanız, komut satırlarınızdaki tam üçlüyü kullanın. Her 3 tür de bu dizeyle yönlendirilir: >/dev/null 2>&1 - Tabii ki, komut dosyasının ayrı bir günlüğe yazması için düzenli yazılar yazabilirsiniz.
SDsolar

Yanıtlar:


119

Çizgiyi şu yap:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

Bu, hem STDOUT (1) hem de STDERR'yi (2) yakalar ve gönderir /dev/null.

MAILTO

Ayrıca MAILTO="", herhangi bir e-posta gönderimini devre dışı bırakacak olanı ayarlayıp sıfırlayarak da e-postayı devre dışı bırakabilirsiniz.

Örnek

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Ek mesajlaşma

Genellikle aşağıdaki mesaj türlerini alırsınız /var/log/syslog:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Bunlar sadece cronjobs dizininin çalıştırıldığı cron üzerinden yapılan bildirimlerdir. Bu mesajın doğrudan bu işlerle ilgisi yok, bunun yerine cronddaemondan doğrudan geliyor . Bunlar hakkında yapabileceğiniz hiçbir şey yok ve bunları devre dışı bırakmamanızı tavsiye ederim, çünkü büyük olasılıkla crondgünlükleri takip eden tek pencereniz onlardır .

Size çok sinir bozucu oluyorlarsa, bunları yapılandırma dosyasından /var/log/syslogalarak onları dosyanızdan çıkarmak için her zaman alternatif bir günlük dosyasına yönlendirebilirsiniz ./etc/syslog.confsyslog


@ rubo77 - bir örnek gösterebilir misiniz? Bununla neyin işe yaramadığını görmem gerek. Googling cevap olarak bu ortaya çıkıyor: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
slm

Bu, tüm çıktılar ve e-postalar için işe
yarar

@ rubo77 - hakkında sormak istediğini düşündüm. Bu mesajları durduramazsınız, onlar crond daemon tarafından üretilir.
slm

@ rubo77 - Değişimin farkındayım, /etc/syslog.confbunun alternatif olduğunu pek sanmıyorum. Bu sadece günlüklerin içine atıldığı dosyayı değiştirecek veya cron mesajlarını tamamen devre dışı bırakabilirsiniz. İstediğini yapmanın bir yolu yok.
slm

1
@ rubo77 - istediğini yapabilmenin tek yolu, onu çağırdıktan grep -v ...sonra koymak crond.
slm

10

Her dakika çalıştırılması gereken bir komut dosyası var. Sorun, cron'un her çalıştırışında / var / log / syslog dosyasına giriş yapmasıdır. Sonunda / var / log / syslog içinde tekrar tekrar tutulduğu mesajı tekrarlarken görüyorum.

Yaptığınız hiçbir şey bunu durdurmuyor gibi gözüküyorsa, sormaya değer: tam olarak bu komut dosyası nedir ve syslog'da gördüğünüz mesaj tam olarak nedir?

Eğer slm'nin önerisi işe yaramadıysa, bunun nedeni bir şeyin doğrudan slog günlüğüne giriş yapmış olmasıdır - ya bazı yorumlarınızda belirtildiği gibi cron ya da cron tarafından yürütülen süreç. Syslog'a gönderilen mesajlar stdin veya stderr'den gelmez, bu yüzden 2>&1&>yardımcı olmaz.

Ne olduğunu bilmiyorsak, söz konusu uygulamanın davranışını yapılandırmanın bir yolu olabilir.

Mesajları çok özel olarak filtrelemek için çoğu çağdaş syslog uygulamasını (birçoğu vardır) yapılandırmanın kesinlikle bir yolu vardır. Örneğin, günlük mesajında ​​kullanılan benzersiz bir etiket varsa, bunu hedefleyebilirsiniz. Fakat yine de, belirli bir mesaj hakkında ya da hangi syslogd'u kullandığınızla ilgili hiçbir şey bilmediğimiz için önerilebilecek özel bir şey yoktur.

Genel noktam, mesajları yönlendirmek / filtrelemek istemiyorsanız, çünkü "bu bütün mesajları yönlendirecektir", sonra filtreleme tekniğini rafine edebilirsiniz. Eğer bağlantılı sunucu hatası parçacığının tesisi tarafından filtreleme bahseder için ( *.cron) - ama sen daha özel filtreler yapılandırabilirsiniz daha.


Debian ve Ubuntu'da mevcut rsyslog var. Debian 5+ üzerinde varsayılan syslog, ubuntu'da bir seçenektir, bu yüzden onu kurmak zorunda kalacaksınız. Bir tür belirli içeriği hedefleyen bir filtre oluşturmak için bunu üste yakın bir yere yerleştirin (diğer kurallardan önce, ancak genel yapılandırmadan sonra modül yükleme vb.) /etc/rsyslog.conf. Bunu yapmanın en iyi yolu, rsyslog.confkendisini düzenlemek değil , /etc/rsyslog.conf.d/dizinde, 50'den küçük iki basamaktan başlayan adla bir dosya oluşturmaktır /etc/rsyslog.conf.d/15-my-filter.conf. Orada böyle bir şey koyabilirsiniz:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

Bu mesaj gönderir /dev/null(veya tercih ederseniz ayrı bir günlük). Ancak, mesaj gönderilecek olan müteakip kurallardan geçmeye devam edecektir /var/log/syslog. Bunu önlemek için:

& stop

Hemen diğer hattan sonra. Bu, önceki kurala uyan her şeyi atar. Veya, tek satırlı kurallar stopiçin bu kural satırının sonuna ekleyebilirsiniz .

rsyslogdYapılandırmayı değiştirdikten sonra yeniden başlatmanız gerekir (örn. Sistem sistemleri systemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP, servetin yeniden başlatılmasına neden olur.


Çünkü rsyslog ~şimdi kullanımdan kaldırıldı ve değiştirilmesi gerekiyor stop. Ayrıca rsyslogd.confdosyadaki pozisyon önemlidir. Yani rysyslog için sadece kullanırdım :msg, contains, "/usr/bin/w3m -no-cookie" stop. Ve sonra yeniden başlatın sudo systemctl restart rsyslog.
Frank Breitling

4

Değişiklik /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

Varsayılan olarak EXTRA_OPTSçizgidir""


2

Yönlendirme /dev/null, çıktıyı komuttan gizler. Bunu yapmazsanız cron çıktıları size postalar. Komuttan çıkan çıktı hiçbir zaman sistem günlüklerinde bitmez (en azından cron tarafından yapılmaz).

Çıktıyı /dev/null, özellikle hata çıktısını yönlendirmek genellikle kötü bir fikirdir : eğer bir şeyler ters giderse, sorunu teşhis edecek hiçbir bilginiz olmaz. Bir posta almak istemiyorsanız, bir günlük dosyasına yönlendirin.

Ancak bunların hiçbiri sorununuzla ilgili değil. Alıntıladığınız mesaj cron'un kendisinden. Cron, bir işi her çalıştırdığında bir günlük girişi yazar. Gördüğüm hiçbir cron uygulaması, farklı işler için farklı günlük yapılandırmaları kullanmanıza izin vermiyor.

Bazı işleri atlamak istiyorsanız, tek seçeneğiniz, syslog arka plan programındaki günlük mesajlarına metin filtreleme uygulamaktır. Sistem günlüğü filtrelemesi için fiili standart, sistem günlüğü olarak rysyslog (sisteminizde varsayılan olabilir veya olmayabilir) çalıştırmaktır. Bu özel komutu nasıl filtreleyeceğiniz konusunda goldilocks'un cevabına bakınız .

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.