Linux

Cronjob Çıktısını stdout’a Yönlendirmek

Cronjob Çıktısını stdout'a Yönlendirmek
Share

1. Giriş

Bazen izleme ve bakım amacıyla sunucunuzda çalışan cron işi çıktısını stdout’a veya başka bir günlük dosyasına kaydetmemiz gerekebilir . Neyse ki cron işi çıktısını günlüğe kaydetmek için kullanabileceğimiz birkaç yöntemimiz var. Bu derste cron işi çıktısını günlüğe kaydetmek için kullanabileceğimiz yaklaşımları tartışacağız.

2. Cron İş Çıktısı

Cron işini her çalıştırdığımızda, sorun giderme için oldukça yararlı olan günlükler oluşturur. Bir cron işinin çıktısı doğrudan /var/spool/cron/crontabs konumunda depolanır. Ancak bu çıktıyı kontrol edip stdout’a gönderebiliriz. Alternatif olarak bu çıktıyı e-posta veya sistem günlükleri aracılığıyla da gönderebiliriz.

Bu, Linux yöneticileri için çok önemlidir çünkü tüm cron işi çıktılarını tek bir yerde organize etmelerine yardımcı olur. Bu nedenle dizinler arasında geçiş yapmak yerine hepsini tek seferde incelemek daha kolaydır.

Varsayılan olarak, cron işi çıktısı Ubuntu ve Debian sistemlerinde /var/log/syslog konumunda ve CentOS’ta /var/log/cron konumunda depolanır . Cron arka plan programı , cron işinin zamanlamasına bağlı olarak crontab’larda listelenen cron işlerini çalıştırır . Cron log çıktısını görüntülemek istiyorsak grep komutunu kullanarak “cron” filtresini uygulayarak bu dosyaları görüntüleyebiliriz:

cat /var/log/syslog | grep cron

Bu, syslog dosyasında kayıtlı tüm cron iş günlüğünü alacaktır.

3. Cron İş Çıkışını stdout’a yönlendirin

Cron işindeki yönlendirme operatörünü kullanarak cron işi çıktısını stdout’a yönlendirebiliriz :

* * * * * /path/to/command > /dev/stdout 2>&1

Örneğin her 10 dakikada bir çalışan ve “ Merhaba Dünya ” yazdıran bir cron işimiz olduğunu varsayalım . Bu cron işi çıktısını stdout’a yönlendirebiliriz . Bu adım için öncelikle crontab dosya düzenleyicisini açacağız :

$ crontab -e

Daha sonra çıktıyı stdout’a yönlendireceğiz :

*/10 * * * * echo "Hello, world!" > /dev/stdout 2>&1

Bu, çıktının yanı sıra hatayı da standart çıktıya yönlendirecektir. Alternatif olarak aynısını herhangi bir Bash betik dosyasıyla da yapabiliriz. Örneğin, cron işi  her 10 dakikada bir /home/user/Documents/myScript.sh çalıştırıyorsa cron komutu, echo  komutu yerine dosya adını kullanacaktır :

*/10 * * * * /home/user/Documents/myScript.sh > /dev/stdout 2>&1

> biçimlendirme sorunlarına neden olabileceğinden stdout’ta >> yerine > kullanılması önerilir . Ancak günlükleri ayrı bir dosyaya gönderiyorsak üzerine yazma operatörü (>) operatörü yerine ekleme operatörünü ( >> ) da kullanabiliriz . Bu, dosyanın üzerine yazılmasını önleyecektir.

Şimdi dosyayı düzenli tutmak için çıktıyı zaman damgasıyla birlikte bir dosyaya yönlendireceğiz:

*/10 * * * * /bin/bash -c "echo $(date) >> /path/to/logfile.log && /home/user/Documents/myScript.sh >> /path/to/logfile.log 2>&1"

Burada /bin/bash -c komutunu kullandık . Bu, cron job komutu içerisinde birden fazla komutu çalıştırmamızı sağlar. $ (date) geçerli tarih ve saati günlük dosyasına ekleyecektir. Ayrıca, /path/to/logfile.log dosyasını gerçek günlük dosyası konumuyla değiştirmemiz gerekecek .

4. Cron İş Çıkışını sistem günlüğüne gönderin

Çıktıyı stdout’a yönlendirmenin yanı sıra , bir cron işinin çıktısını da sistem günlüğüne yönlendirebiliriz . Öncelikle crontab editörünü açalım :

$ crontab -e

Şimdi, /home/user/Documents/myScript.sh çıktısını syslog’a yönlendirmek için / dev /stdout yerine /usr/bin/logger’ı ekleyeceğiz :

*/10 * * * * /home/user/myscript.sh 2>&1 | /usr/bin/logger -t CRONOUTPUT

/10 * * * * her 10 dakikada bir çalışacak bir cron işidir. Daha sonra, cron işinde yürütülecek kabuk betiğinin yoluna sahibiz. 2>&1 standart çıktıyı ve hatayı boru ( | ) operatöründen sonra yazılan komuta iletecektir .

Standart çıktı ve hata, CRONOUTPUT başlığıyla /usr/bin/logger’a aktarılacaktır . -t seçeneği çıktının etiketini temsil eder. Bu örnekte cron işimizle CRONOUTPUT etiketini geçtik . Böylece cron işimiz logger dosyasına CRONOUTPUT başlığı ile kaydedilecektir .

Alternatif olarak, komutu günlükçü yolunun tamamı olmadan da yazabiliriz:

*/10 * * * * /home/user/myscript.sh 2>&1 | logger -t CRONOUTPUT

Şimdi sistem günlüğüne kaydedilen cron işinin çıktısını görüntülemek için cat komutunu grep komutuyla birlikte kullanacağız :

$ cat /var/log/syslog | grep CRONOUTPUT

Bu, mevcut tüm cron işi çıktılarını listeler.

5. Cron İş Günlüklerini Ayrı Bir Dosyaya Yönlendirin

Cron işi çıktılarını, özellikle cron günlükleri için oluşturulan ayrı bir günlük dosyasına da yönlendirebiliriz . Bunu yapmak için nano düzenleyicide varsayılan yapılandırma dosyasını açacağız :

$ nano /etc/rsyslog.d/50-default.conf

Burada rsyslog dosyasını kullandık  . rsyslog, orijinal syslogd arka plan programının yerini alan syslog protokolünün bir uygulamasıdır . Basit ve güvenilir bir günlük kaydı çözümüdür. Ancak gelişmiş filtreleme ve yönlendirme yetenekleri istiyorsak sistem günlüğü tutma daha iyi bir seçenektir .

syslog-ng, syslogd protokolünün modüler ve esnek bir uygulamasıdır . Yalnızca mesaj filtreleme, ayrıştırma ve yönlendirme sunmakla kalmaz, aynı zamanda günlük tutma davranışını özelleştirmemize ve yapılandırmamıza da olanak tanır.

Dosya açıldığında aşağıdaki kod satırının açıklamasını kaldıracağız:

#cron.* /var/log/cron.log

Yorumu kaldırdıktan sonra şöyle görünecektir:

cron.* /var/log/cron.log

Şimdi kaydetmek için Ctrl + S tuşlarına ve nano düzenleyiciden çıkmak için Ctrl + X tuşlarına basacağız . Daha sonra cron.log dosyasını oluşturacağız :

$ sudo touch /var/log/cron.log

Bundan sonra sistem günlüğü kullanıcısına yazma iznini atayacağız:

$ sudo chmod 640 /var/log/cron.log
$ sudo chown syslog:adm /var/log/cron.log

Son olarak rsyslog hizmetini yeniden başlatacağız :

$ sudo systemctl restart rsyslog.service

Artık cron işleri çalıştırıldığında çıktı bu cron.log dosyasına kaydedilecektir .

6. Cron İşi En İyi Uygulamaları

Cron işleri çoğu Linux kullanıcısının hayatının bir parçası olduğundan, cron işleriyle çalışmak için en iyi birkaç uygulamayı bir araya getirdik:

  • Her zaman komutun veya komut dosyasının tam yolunu belirtin.
  • Kaydı korumak için çıktıyı ayrı bir günlük dosyasına yönlendirin .
  • Cron işlerinin birbiriyle örtüşmediğinden veya çakışmadığından emin olun.
  • Diğer kullanıcıların da anlayabilmesi için crontab dosyasındaki açıklayıcı yorumları kullanın .
  • Cron işlerini üretime dağıtmadan önce test edin .

7. Karar

Bu yazımızda bulut sunucu da çalışan bir cron işinin çıktısının nasıl yönlendirileceğini tartıştık. İlk olarak çıktıyı stdout’a nasıl yönlendirebileceğimizi ele aldık . Daha sonra çıktının syslog’a veya ayrı bir log dosyasına nasıl gönderileceğini tartıştık. Son olarak cron işlerini yürütürken en iyi uygulamalardan bazılarına dikkat çektik.