Vraag Hoe e-mail te krijgen van (mislukte) cron-jobs in Ubuntu?


Ik maak cron-jobs in Ubuntu door het uitvoerbare bestand in een van /etc/cron.{daily,hourly,monthly,weekly}. Er zijn veel mappen die beginnen met cron:

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

Ik zou graag een e-mail ontvangen van mijn scripts wanneer:

  1. Een script mislukt en geeft een exitcode van niet nul.
  2. Het script heeft me iets te vertellen

ik heb ssmtp geïnstalleerd en werkend, stuur ik mijn e-mail vanuit mijn Google-account. Het feit dat SSMTP alleen e-mail met één account kan verzenden, is voor mij geen probleem. Het is gewoon een thuisserver en de gebruikers die ik heb, kunnen cron-taken niet toevoegen.

Ik zou graag willen weten hoe de mailing van scripts meestal werkt in Linux / Unix in het algemeen en specifiek in Ubuntu. Ik zou ook graag een goede manier willen weten om mails te ontvangen in de twee bovenstaande situaties.


43
2017-08-14 10:01


oorsprong




antwoorden:


Standaard stuurt cron een e-mail naar de eigenaar van het account waaronder de crontab wordt uitgevoerd.

De systeembrede crontab wordt in / etc / crontab uitgevoerd onder de gebruiker `root '

Omdat root op grote schaal wordt gebruikt, raad ik u toch aan om een ​​root alias aan uw / etc / aliases-bestand toe te voegen. (voer 'newaliases' uit na)

De normale manier om dit te structureren is om root te aliasen aan een andere gebruiker op het systeem, bijvoorbeeld voor mij zou ik alias 'root' naar 'phil' (mijn gebruikersaccount) en alias 'phil' naar mijn externe e-mailadres.

Als u een specifieke gebruiker cron heeft die u naar uw uitvoer gemaild wilt hebben, dan kunt u / etc / aliases opnieuw gebruiken (mits u superuser-toegang hebt) om de gebruiker naar een ander e-mailadres om te leiden, of u kunt het volgende gebruiken bij top van je crontab:

MAILTO="email@domain.com"

Als e-mail moet worden verzonden naar een lokale gebruiker, kunt u in plaats daarvan alleen de gebruikersnaam opgeven:

MAILTO=someuser

Zie crontab (5) voor meer informatie als je meer informatie nodig hebt:

man 5 crontab

57
2017-08-14 10:45



zijn niet /etc/aliases inzendingen zouden volgen het formaat  name: value1, value2, ...? Ik weet het niet, misschien is het formaat op enig moment in de afgelopen 8 jaar veranderd. - Nathan Jones
"voor mij zou ik alias 'root' naar 'phil' (mijn gebruikersaccount) en alias 'phil' naar mijn externe e-mailadres verwijzen." Hoe 'phil' een alias te geven op een extern e-mailadres? - Howard Lee


Om e-mail te ontvangen van vixie cron, hebt u iets nodig dat de sendmail-opdracht repliceert. Dus het installeren van postfix of SSMTP zal dit deel uitzoeken. Als u postfix gebruikt, kan het aliassenbestand worden gebruikt om systeemgebruikers toe te wijzen aan echte e-mailadressen.

Als u MAILTO = "foo@bar.com" boven aan een crontab toevoegt, wordt elke uitvoer van de cron-taak gemaild. Dit is ongeacht de foutcode.

Voor scripts die fouten correct uitvoeren in STDERR en vervolgens gemakkelijk gemaild kunnen worden als ze fout gaan, doe je dit gewoon:

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

Hierdoor wordt alleen de STDOUT omgeleid naar nul. Als er STDERR-berichten aanwezig zijn, ontvangen deze een e-mail.

Ik heb echter geconstateerd dat sommige scripts foutmeldingen ten onrechte uitvoeren als STDOUT en de exit-code instellen op 1. Ik heb geen manier gevonden om de uitvoer hiervan te bemachtigen, maar negeer de uitvoer als de exit-code 0. De enige methode Ik kan denken aan is om de uitvoer omleiden naar een bestand, dan als de exit-code is niet 0 output dat bestand voor cron te grijpen. Lijkt me echter behoorlijk vreselijk.


27
2017-10-27 17:34



Kon het proberen habilis.net/cronic - dfrankow
Briljant, bedankt! - Theozaurus


Als u alle uitvoer (stdout en stderr) naar een specifiek adres wilt verzenden, kunt u de MAILTO variabel. Plaats bijvoorbeeld het volgende bovenaan het script.

MAILTO="address@example.com"

8
2017-08-14 10:18





probeer "root: your@email.address" toe te voegen aan / etc / aliases

die alle berichten voor die gebruiker naar uw e-mail zal sturen. als u niet alle berichten wilt, kunt u hier specifiek een gebruiker voor maken.

Zolang het script iets uitvoert, ontvangt u een e-mail.


5
2017-08-14 10:14





Ik denk niet dat SSMTP voldoet aan wat je nodig hebt om te doen. U hebt iets nodig dat e-mail van de cron-processen kan "ontvangen" en vervolgens naar uw echte mailbox kan sturen.

Ik gebruik Sendmail, maar dat komt omdat ik een oude hand van de zon ben; Ik weet dat het gelachen wordt door alle coole kinderen die tegenwoordig Postfix gebruiken. Uw ubuntu-community kan u begeleiden bij het instellen van uw e-mailsysteem.


2
2017-08-14 15:47



ssmtp implementeert / bin / sendmail - bobpaul


Op al mijn productieservers die dagelijks zo'n 20 cronjobs draaien, zweer ik bij het python-cronwrap-pakket. Bekijk het hier: http://pypi.python.org/pypi/cronwrap. Het is heel eenvoudig te configureren en vooral betrouwbaar.


2
2017-07-29 01:44





Een alternatief - Ik archiveer alle root-mail naar sommige bestanden en verwijder vervolgens de originele mail.

Ik maak een script (hier is het belangrijkste gedeelte) -

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

Dit houdt de dingen netjes en ik kan het in de gaten houden. Ik zou een dagelijks e-mailbestand naar een externe e-mail-ID kunnen e-mailen, enz.


2
2018-05-27 17:05