Comment enregistrer les tâches cron?

218

Je veux savoir comment je peux voir exactement ce que font les tâches cron à chaque exécution. Où se trouvent les fichiers journaux? Ou puis-je envoyer la sortie à mon e-mail? J'ai défini l'adresse e-mail pour envoyer le journal lorsque la tâche cron s'exécute, mais je n'ai encore rien reçu.

Adrian M.
la source
Jetez un œil à cet article: Gestion des fichiers journaux créés par les tâches cron .
codeforester

Réponses:

347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

enregistrera toutes les sorties du travail cron dans /var/log/myjob.log

Vous pouvez utiliser mailpour envoyer des e-mails. La plupart des systèmes envoient cronpar courrier électronique la sortie du travail non gérée à l'utilisateur root ou à l'utilisateur correspondant.

Spliffster
la source
78
Description de ce que cela signifie 2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Yamaneko
5
quel pourrait être le problème si ce fichier journal n'est jamais créé?
pince
10
FWIW, Si vous voulez les deux stderret stdoutdans le journal, le 2>&1doit venir après l'indirection:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq
2
Comment insérer YYYY-MM-DD_hh-mm-secdans le nom du fichier de sortie, afin que chaque nom de fichier soit différent et conservé sans réécriture?
Danijel
6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile
61

Par défaut, cron se connecte à / var / log / syslog afin que vous puissiez voir les entrées liées à cron en utilisant:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log

Matthew Lock
la source
2
Sur Ubuntu 12.04, la valeur par défaut est sans .log, c'est-à-dire / var / log / syslog
tishma
5
utiliser journalctl | grep cronsur les systèmes systemd
Microsoft Linux TM
2
/var/log/cronsur AWS Linux AMI.
Jonathan
2
ousudo journalctl -u cron
Gianfranco P.
2
Où exactement cronest enregistré est très dépendant du système. Il y a une réponse séparée avec des détails sur la façon dont les différentes destinations de journalisation sont configurées sur les systèmes Linux (ou plus correctement, les systèmes qui utilisent syslog). D'autres systèmes peuvent avoir une manière différente de configurer ces choses.
tripleee
10

Voici mon code:

* * * * * your_script_fullpath >> your_log_path 2>&1
Haimei
la source
">>" signifie ajouter des données à Fileright? que signifie "2> & 1", sortie complète avec erreur, n'est-ce pas?
Nullpointer
3
Les questions de redirection de base sont mieux vérifiées dans le manuel. Il y a également un pot métrique de questions en double sur ces opérateurs ici sur Stack Overflow. Mais oui, à peu près; >>ajoute et 2>&1dit d'envoyer l'erreur standard au même endroit que la sortie standard.
tripleee du
10

Il existe au moins trois types différents de journalisation:

  1. L'enregistrement AVANT l'exécution du programme, qui n'enregistre que SI le cronjob a ESSAYÉ d'exécuter la commande. Celui-ci se trouve dans / var / log / syslog, comme déjà mentionné par @Matthew Lock.

  2. L'enregistrement des erreurs APRÈS que le programme a tenté de s'exécuter, qui peut être envoyé à un e-mail ou à un fichier, comme mentionné par @Spliffster. Je préfère me connecter à un fichier, car avec le courrier électronique, ALORS vous avez une NOUVELLE source de problèmes, et sa vérification si l'envoi et la réception du courrier électronique fonctionnent parfaitement. Parfois c'est le cas, parfois non. Par exemple, dans une simple machine de bureau commune dans laquelle vous n'êtes pas intéressé par la configuration d'un smtp, vous préférerez parfois vous connecter à un fichier:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • J'envisagerais également de vérifier les autorisations de / ABSOLUTE_PATH_TO_LOG et d'exécuter la commande à partir des autorisations de cet utilisateur. Juste pour vérification, pendant que vous testez si cela pourrait être une source potentielle de problèmes.
  3. L'enregistrement du programme lui-même, avec sa propre gestion des erreurs et l'enregistrement à des fins de suivi.

Il existe quelques sources courantes de problèmes avec les tâches cron: * Le CHEMIN ABSOLU du binaire à exécuter. Lorsque vous l'exécutez à partir de votre shell, cela peut fonctionner, mais le processus cron semble utiliser un autre environnement, et donc il ne trouve pas toujours les binaires si vous n'utilisez pas le chemin absolu. * Les BIBLIOTHEQUES utilisées par un binaire. C'est plus ou moins le même point précédent, mais assurez-vous que, si vous mettez simplement le NOM de la commande, se réfère exactement au binaire qui utilise la même bibliothèque, ou mieux, vérifiez si le binaire auquel vous faites référence avec le chemin absolu est la même chose que vous faites référence lorsque vous utilisez directement la console. Les binaires peuvent être trouvés à l'aide de la commande Locate, par exemple:

$locate python

Assurez-vous que le binaire que vous référerez est le même que le binaire que vous appelez dans votre shell, ou testez simplement à nouveau dans votre shell en utilisant le chemin absolu que vous prévoyez de mettre dans le cronjob.

  • Une autre source courante de problèmes est la syntaxe dans le cronjob. N'oubliez pas qu'il existe des caractères spéciaux que vous pouvez utiliser pour les listes (virgules), pour définir des plages (tirets -), pour définir l'incrément de plages (barres obliques), etc. Jetez un œil: http://www.softpanorama.org/Utilities/ cron.shtml
David L
la source
8

Sur Ubuntu, vous pouvez activer un cron.logfichier pour contenir uniquement les entrées CRON.

Décommentez la ligne qui mentionne crondans le /etc/rsyslog.d/50-default.conffichier:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Enregistrez et fermez le fichier, puis redémarrez le rsyslogservice:

sudo systemctl restart rsyslog

Vous pouvez maintenant voir les entrées du journal cron dans son propre fichier:

sudo tail -f /var/log/cron.log

Exemples de sorties:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Cependant, vous ne verrez pas plus d'informations sur les scripts qui ont été réellement exécutés à l'intérieur /etc/cron.dailyou /etc/cron.hourly, à moins que ces scripts ne dirigent la sortie vers cron.log (ou peut-être vers un autre fichier journal).

Si vous souhaitez vérifier si une crontab est en cours d'exécution et ne pas avoir à la rechercher dans cron.logou syslog, créez une crontab qui redirige la sortie vers un fichier journal de votre choix - quelque chose comme:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Étapes prises à partir de: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/

Gianfranco P.
la source
Ubuntu 16.04 n'affichait aucun journal cron et ces informations ont fait l'affaire.
pojda
5

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=recipientdans 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>&1pour 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.)

cronLes 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/stderrpour les messages d'erreur, mais ce n'est pas correctement portable; en Perl, warnet dieimprimer à l'erreur standard; en Python, écrivez sys.stderrou 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.

tripleee
la source
1

Dans le cas où vous exécutez une commande avec sudo, cela ne le permettra pas. Sudo a besoin d'un tty.

Saad Masood
la source
4
Cela dépend également de la sudoconfiguration. Les choses qui doivent s'exécuter sans moyen de fournir un mot de passe doivent être configurées avec NOPASSWD:dans votre sudoersconfiguration.
tripleee
0

Si vous souhaitez toujours vérifier vos tâches Cron, vous devez fournir un compte de messagerie valide lors de la configuration des tâches Cron dans cPanel.

Lorsque vous spécifiez un e-mail valide, vous recevrez la sortie du travail cron qui est exécuté. Ainsi, vous pourrez le vérifier et vous assurer que tout a été correctement exécuté. Notez que vous ne recevrez pas d'e-mail s'il n'y a pas de sortie de la commande cron job.

N'oubliez pas que vous recevrez un e-mail pour chacune des tâches cron exécutées. Cela peut inonder votre boîte de réception au cas où vos crons fonctionneraient trop souvent

Faridul Khan
la source