cron
envoie déjà la sortie standard et l'erreur standard de chaque travail exécuté par courrier au propriétaire du travail cron.
Vous pouvez utiliser MAILTO=recipient
dans lecrontab
fichier pour envoyer les e-mails à un autre compte.
Pour que cela fonctionne, vous devez avoir le courrier qui fonctionne correctement. La livraison à une boîte aux lettres locale n'est généralement pas un problème (en fait, les chances sontls -l "$MAIL"
que vous en ayez déjà reçu), mais pour le sortir de la boîte et le sortir sur Internet, il faut le MTA (Postfix, Sendmail, qu'avez-vous) pour être correctement configuré pour se connecter au monde.
S'il n'y a pas de sortie, aucun e-mail ne sera généré.
Un arrangement courant consiste à rediriger la sortie vers un fichier, auquel cas, bien sûr, le démon cron ne verra le travail renvoyer aucune sortie. Une variante consiste à rediriger la sortie standard vers un fichier (ou à écrire le script pour qu'il n'imprime jamais rien - peut-être qu'il stocke les résultats dans une base de données à la place, ou effectue des tâches de maintenance qui ne produisent tout simplement rien?) Et ne reçoive un e-mail que s'il y a est un message d'erreur.
Pour rediriger les deux flux de sortie, la syntaxe est
42 17 * * * script >>stdout.log 2>>stderr.log
Remarquez comment nous ajoutons (double >>
) au lieu d'écraser, de sorte que la sortie d'un travail précédent ne soit pas remplacée par la suivante.
Comme suggéré dans de nombreuses réponses ici, vous pouvez envoyer les deux flux de sortie vers un seul fichier; remplacer la deuxième redirection par 2>&1
pour dire "l'erreur standard doit aller partout où la sortie standard va". (Mais je n'approuve pas particulièrement cette pratique. Cela a surtout du sens si vous ne vous attendez vraiment à rien sur la sortie standard, mais que vous avez peut-être oublié quelque chose, provenant peut-être d'un outil externe appelé à partir de votre script.)
cron
Les travaux s'exécutent dans votre répertoire personnel, donc tout nom de fichier relatif doit être relatif à celui-ci. Si vous souhaitez écrire en dehors de votre répertoire personnel, vous devez évidemment vous assurer séparément que vous avez accès en écriture à ce fichier de destination.
Un contre-modèle courant consiste à tout rediriger vers /dev/null
(puis à demander à Stack Overflow de vous aider à comprendre ce qui s'est mal passé lorsque quelque chose ne fonctionne pas; mais nous ne pouvons pas non plus voir la sortie perdue!)
Dans votre script, assurez-vous de séparer la sortie régulière (résultats réels, idéalement sous forme lisible par machine) et les diagnostics (généralement formatés pour un lecteur humain). Dans un script shell,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Certaines plates-formes (et par exemple GNU Awk) vous permettent d'utiliser le nom de fichier /dev/stderr
pour les messages d'erreur, mais ce n'est pas correctement portable; en Perl, warn
et die
imprimer à l'erreur standard; en Python, écrivez sys.stderr
ou utilisez logging
; à Ruby, essayez $stderr.puts
. Notez également comment les messages d'erreur doivent inclure le nom du script qui a généré le message de diagnostic.