TÜM stderr çıktısı crontab'ın dosyaya kaydedilmesi


12

Örneğin, stderrbir komut dosyasının bu şekilde günlüğünü tutabilirim :

* * * * * run_script.sh > /var/log.txt 2>&1

Ancak stderrcrontab'ımdaki tüm komut dosyalarını kaydetmek istiyorum . > /var/log.txt 2>&1Tüm komut dosyalarına ekleyebilirim , ancak içinde yüzlerce komut dosyası varsa iyi değil cron. Bunu yapmanın başka, daha basit bir yolu var mı?

Yanıtlar:


6

Crontab'da, MAILTO'yu komut dosyası çalıştıran bir posta diğer adına işaret edecek şekilde ayarlayabilirsiniz. Bu komut dosyası bir posta iletisini kabul eder, üstbilgileri ve diğer goop'ları keser ve geri kalanını günlükçüyle günlüğe kaydeder. Tüm cron script çıktısı MAILTO tarafından belirtilen adrese gönderildiğinden, her şeyi yakalarsınız.

Örnek: in crontab

MAILTO=myalias

/ Etc / mail / takma adlarda (sendmail kullandığınız varsayılarak)

myalias:"|/usr/local/bin/my-processing-script.sh"

ve komut dosyasının posta başlıklarını kaldırmasını ve cron çıktısını işlemesini sağlayın.


MAILTO, takma ad, MTA, komut dosyası vb. ayarlama konusunda daha spesifik olabilir misiniz?
Endolit

1
@endolith Cevabı, sendmail ve geniş uyumlu MTA'lar için çalışması gereken temel bir kurulum sağlamak için düzenledim. Senaryoyu kendiniz yazmanız gerekecek.
Kyle Jones

5

Komut tarafından üretilen herhangi bir çıktı, crontab (5) dosyasında ayarlandığı gibi MAILTO ortam değişkeninde belirtilen kullanıcıya veya MAILTO değişkeni ayarlanmamışsa (veya bu (1) veya toplu iş (1) işindeyse) gönderilir. ), iş sahibine. Bir komut çıktı üretmezse veya MAILTO ortam değişkeni boş dizeye ayarlanırsa, posta gönderilmez.

Yerel posta kullandığından, gerçekten hiçbir şey ayarlamanıza veya zaten burada değilse mailx'i yüklemenize gerek yoktur. Cron size çıktıyı gönderir, postayı bir dosyaya kaydedebilir ve oradan birçok şey yapabilirsiniz. Cron'un doğrudan ihtiyaçlarınıza göre çalışma şeklini değiştirmeye çalışmak, gitmenin yolu değildir. Eğer böyle düşünmüyorsanız, sadece cronu yamalayın ve yeniden oluşturun, my_cron olarak adlandırın ve cron yerine kullanın. Ve sonunda my_cron'unuzu güncel tutmaya ve sık sık yeniden oluşturmaya hazır olun.

Her şeyi günlüğe kaydetmek ve ilk hatada durmak için bunu tüm komut dosyalarınızın başına ekleyin

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e

yönlendirme sırası tam tersi olmalı mı? > /var/log/YOUR_LOG_FILE 2>&1yani, önce stdout'u bir dosyaya yeniden yönlendirin ve daha sonra stderr'ı stdout'a (şimdi dosyayı işaret eder) yönlendirin.
jfs

Minimal bir sunucuda, sadece Cron tarafından üretilen hataları okumak için bir posta hizmeti ve muhtemelen bir posta istemcisi yüklemeniz oldukça çılgınca. Anarşist bir tasarım kararı gibi geliyor.
James McMahon

0

Ryan Ye'in /programming//a/7145618/20774 adresindeki senaryosu bunun için de yararlıdır, ancak hem stdout hem de stderr kullanmaktadır.


Bunu yapmak için küçük bir komut dosyası cronlog.sh var. Komut dosyası kodu

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Sonra yapabilirsin

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Örnek sonuç

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
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.