Enregistrement de toutes les sorties stderr de crontab dans un fichier

12

Par exemple, je peux enregistrer stderrun script de cette façon:

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

Mais je veux enregistrer stderrtous les scripts dans ma crontab. Je peux ajouter > /var/log.txt 2>&1à tous les scripts, mais ce n'est pas bien si j'ai des centaines de scripts dedans cron. Existe-t-il un autre moyen plus simple de procéder?

Maslov Anton
la source

Réponses:

6

Dans crontab, vous pouvez définir MAILTO pour pointer vers un alias de messagerie qui exécute un script. Ce script accepterait un message électronique, enlèverait les en-têtes et autres goop et enregistrerait le reste avec l'enregistreur. Puisque toutes les sorties du script cron sont envoyées à l'adresse spécifiée par MAILTO, vous capturez tout.

Exemple: dans crontab

MAILTO=myalias

Dans / etc / mail / aliases (en supposant que vous utilisez sendmail)

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

et avoir la bande de script des en-têtes de courrier et traiter la sortie cron.

Kyle Jones
la source
pouvez-vous être plus précis sur la configuration de MAILTO, alias, MTA, script, etc.?
endolith
1
@endolith J'ai édité la réponse pour donner une configuration de base qui devrait fonctionner pour sendmail et les MTA largement compatibles. Vous devrez écrire le script vous-même.
Kyle Jones
5

Toute sortie produite par une commande est envoyée à l'utilisateur spécifié dans la variable d'environnement MAILTO telle que définie dans le fichier crontab (5) ou, si aucune variable MAILTO n'est définie (ou s'il s'agit d'un travail at (1) ou batch (1) ), au propriétaire de l'emploi. Si une commande ne produit aucune sortie ou si la variable d'environnement MAILTO est définie sur la chaîne vide, aucun courrier ne sera envoyé.

Puisqu'il utilise le courrier local, vous n'avez vraiment pas besoin de configurer quoi que ce soit, ou peut-être simplement d'installer mailx s'il n'est pas déjà là. Cron vous enverra la sortie, vous pouvez enregistrer le courrier dans un fichier et faire beaucoup de choses à partir de là. Essayer de modifier la façon dont cron fonctionne pour répondre directement à vos besoins n'est pas la voie à suivre. Si vous ne le pensez pas, il suffit de patcher et de reconstruire cron, appelez-le my_cron et utilisez-le à la place de cron. Et soyez prêt à éventuellement garder votre my_cron à jour et à le reconstruire souvent.

Ajoutez-le au début de tous vos scripts pour tout enregistrer et arrêtez-vous à la première erreur

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
Aki
la source
l'ordre de redirection doit-il être l'inverse? > /var/log/YOUR_LOG_FILE 2>&1c'est-à-dire, redirigez d'abord stdout vers un fichier, puis redirigez ensuite stderr vers stdout (qui pointe maintenant vers le fichier).
jfs
C'est assez fou que sur un serveur minimal, vous ayez besoin d'installer un service de messagerie, et éventuellement un client de messagerie, juste pour lire les erreurs produites par Cron. Cela ressemble à une décision de conception anarchique.
James McMahon
0

Le script de Ryan Ye sur /programming//a/7145618/20774 est également utile pour cela, bien qu'il fasse à la fois stdout et stderr.


J'ai un petit script cronlog.sh pour le faire. Le code du script

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

Alors tu pourrais faire

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

Exemple de résultat

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
James McMahon
la source