cron
posta yoluyla çalıştırdığı her işin standart çıktısını ve standart hatasını zaten cron işinin sahibine gönderir.
Sen kullanabilirsiniz MAILTO=recipient
içinde crontab
farklı bir hesaba gönderilen e-postaların dosyası.
Bunun çalışması için, postanın düzgün bir şekilde çalışması gerekir. Yerel bir posta kutusuna teslim etmek genellikle bir sorun değildir (aslında, ls -l "$MAIL"
zaten bazılarını aldığınız ortaya çıkacaktır) ancak kutunun dışına çıkıp internete çıkmak için MTA (Postfix, Sendmail, ne var) dünyaya bağlanmak için düzgün yapılandırılmış olmalıdır.
Çıktı yoksa, e-posta oluşturulmaz.
Yaygın bir düzenleme, çıktıyı bir dosyaya yönlendirmektir, bu durumda cron arka plan programı işin herhangi bir çıktı döndürdüğünü görmez. Bir varyant, standart çıktıyı bir dosyaya yeniden yönlendirmektir (veya komut dosyasını hiçbir şey yazdırmayacak şekilde yazabilir - belki de sonuçları bir veritabanında depolar veya herhangi bir şey çıktılamayan bakım görevleri gerçekleştirir?) Ve yalnızca varsa bir e-posta alır bir hata mesajıdır.
Her iki çıkış akışını yeniden yönlendirmek için sözdizimi
42 17 * * * script >>stdout.log 2>>stderr.log
Üzerine >>
yazmak yerine nasıl eklediğimizi (iki katına ) dikkat edin , böylece önceki iş çıktılarının yerini bir sonraki iş çıktısı alır.
Burada birçok yanıtta önerildiği gibi, her iki çıktı akışının da tek bir dosyaya gönderilmesini sağlayabilirsiniz; ikinci yönlendirmeyi 2>&1
"standart hata gittiğinde standart hata gitmelidir" şeklinde değiştirin. (Ama bu uygulamayı özellikle desteklemiyorum. Standart çıktıda gerçekten bir şey beklemiyorsanız, ancak belki de senaryonuzdan çağrılan harici bir araçtan gelen bir şeyi gözden kaçırmış olmanız mantıklıdır.)
cron
işler ana dizininizde çalışır, bu nedenle göreli dosya adları buna göre olmalıdır. Ana dizininizin dışında yazmak istiyorsanız, bu hedef dosyaya yazma erişiminiz olduğundan ayrı olarak emin olmanız gerekir.
Yaygın bir antipattern, her şeyi yeniden yönlendirmektir /dev/null
(ve bir şey çalışmadığında neyin yanlış gittiğini anlamanıza yardımcı olması için Yığın Taşması'nı isteyin; ancak kayıp çıktıyı da göremeyiz!)
Betiğinizin içinden, düzenli çıktıyı (gerçek sonuçlar, ideal olarak makine tarafından okunabilir biçimde) ve tanılamayı (genellikle bir insan okuyucu için biçimlendirilmiş) ayrı tuttuğunuzdan emin olun. Bir kabuk komut dosyasında,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Bazı platformlar (ve örneğin GNU Awk), dosya adını /dev/stderr
hata iletileri için kullanmanıza izin verir , ancak bu düzgün taşınabilir değildir; Perl'de warn
ve die
standart hataya yazdırın; Python'da, yaz sys.stderr
veya kullanma logging
; Ruby'de deneyin $stderr.puts
. Hata mesajlarının, tanılama mesajını üreten komut dosyasının adını nasıl içermesi gerektiğine de dikkat edin.