web-dev-qa-db-fra.com

Comment faire taire complètement un cronjob vers / dev / null /?

Sur mon bureau Ubuntu et sur mon serveur Debian, j'ai un script qui doit être exécuté chaque minute (un script qui appelle le minute-tic de mon espace navigateur en ligne ).

Le problème est que sur les dérivés Debian, cron se connecte à /var/log/syslog à chaque exécution. Je finis par voir répéter le message qu'il a été exécuté à maintes reprises dans /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

Je sais que pour supprimer la sortie d'un programme, je peux le rediriger vers /dev/null, par exemple pour masquer tous les messages d'erreur et d'avertissement d'un programme, je peux créer une ligne dans crontab comme celle-ci

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

Mais je voudrais exécuter un cronjob et être sûr que toutes les sorties ou erreurs générées sont transmises à NULL, donc il ne génère aucun message dans syslog et ne génère aucun e-mail


ÉDITER:
il existe une solution pour rediriger les cron-logs dans un journal séparé comme proposé ici en changeant /etc/syslog.conf

Mais l'inconvénient est que TOUTES les sorties de tous les cronjobs sont redirigées.

Puis-je en quelque sorte rediriger un seul cronjob vers un fichier journal distinct? Configurable de préférence à l'intérieur du cron.hourly fichier lui-même.

78
rubo77

Faites la ligne ceci:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

Cela capturera à la fois STDOUT (1) et STDERR (2) et les enverra à /dev/null.

MAILTO

Vous pouvez également désactiver l'e-mail en définissant puis en réinitialisant le MAILTO="" qui désactivera l'envoi de tout e-mail.

Exemple

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="[email protected]"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Messagerie supplémentaire

Souvent, vous obtiendrez les types de messages suivants dans /var/log/syslog:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Ce sont simplement des notifications via cron qu'un répertoire de cronjobs a été exécuté. Ce message n'a rien à voir directement avec ces travaux, mais provient directement du démon crond. Il n'y a vraiment rien que vous puissiez faire à ce sujet, et je vous encourage à ne pas les désactiver, car ils sont probablement la seule fenêtre que vous avez sur les événements de crond via les journaux.

S'ils sont très ennuyeux pour vous, vous pouvez toujours les diriger vers un autre fichier journal pour les retirer de votre /var/log/syslog fichier, via le /etc/syslog.conf fichier de configuration pour syslog.

125
slm

avoir un script qui doit être exécuté chaque minute. Le problème est que cron se connecte à/var/log/syslog à chaque exécution. Je finis par voir répété le message qu'il a été répété encore et encore dans/var/log/syslog

Puisque rien de ce que vous faites ne semble arrêter cela, il vaut la peine de se demander: quel exactement est ce script et ce exactement est le message que vous voyez dans syslog?

Si la suggestion de slm n'a pas fonctionné, c'est parce que quelque chose se connecte directement à syslog - soit cron, comme cela semble implicite dans certains de vos commentaires, soit le processus exécuté par cron. Les messages envoyés à syslog ne proviennent pas de stdin ou stderr, donc 2>&1&> n'aidera pas.

Il pourrait y avoir un moyen de configurer le comportement de l'application en question, sauf que nous ne savons pas de quoi il s'agit.

Il existe certainement un moyen de configurer la plupart des implémentations syslog contemporaines (il y en a plusieurs) pour filtrer les messages de manière très spécifique. Par exemple, si une balise unique est utilisée dans le message de journal, vous pouvez la cibler. Mais encore une fois, puisque nous ne savons rien du message particulier ou du syslogd que vous utilisez, il n'y a rien de spécifique qui peut être recommandé.

Mon point général est que si vous ne voulez pas rediriger/filtrer les messages parce que "cela redirigera tous les messages", alors vous pouvez affiner la technique de filtrage. Le fil de défaut du serveur que vous avez lié ne fait que mentionner filtrage par installation (*.cron) - mais vous pouvez configurer des filtres plus spécialisés que cela.


Debian et Ubuntu ont tous deux rsyslog disponibles. Sur debian 5+ c'est le syslog par défaut, sur ubuntu c'est une option, vous devrez donc l'installer. Pour créer un filtre qui cible une sorte de contenu spécifique, placez-le près du haut (c'est-à-dire avant toute autre règle, mais après la configuration générale, module chargement, etc.) de /etc/rsyslog.conf. La meilleure façon de procéder est de ne pas modifier le rsyslog.conf lui-même, mais pour créer un fichier dans /etc/rsyslog.conf.d/ répertoire, avec un nom commençant par deux chiffres inférieurs à 50, c'est-à-dire /etc/rsyslog.conf.d/15-my-filter.conf. Vous pouvez y mettre quelque chose comme ceci:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

Cela enverra le message à /dev/null (ou un journal séparé si vous préférez). Cependant, le message sera toujours transmis via les règles suivantes qui l'enverront à /var/log/syslog. Pour éviter cela:

& stop

Immédiatement après cette autre ligne. Cela jette tout ce qui correspond à la règle précédente. Ou, pour les règles sur une seule ligne, vous pouvez simplement ajouter stop à la fin de cette ligne de règle.

Vous devez redémarrer rsyslogd après avoir modifié la configuration, (par exemple sur les systèmes systemd systemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP provoque le redémarrage du démon.

10
goldilocks

Changement /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

Par défaut, le EXTRA_OPTS la ligne est ""

5
Dallas

Redirection vers /dev/null masque la sortie de la commande. Si vous ne le faites pas, cron vous envoie la sortie. La sortie de la commande ne se retrouve jamais dans les journaux système (du moins pas par le fait de faire un cron).

C'est généralement une mauvaise idée de rediriger la sortie vers /dev/null, en particulier la sortie d'erreur: si quelque chose se passe mal, vous n'aurez aucune information pour diagnostiquer le problème. Si vous ne souhaitez pas recevoir de courrier, redirigez-le vers un fichier journal.

Cependant, rien de tout cela ne concerne votre problème. Le message que vous citez provient de cron lui-même. Cron écrit une entrée de journal chaque fois qu'il exécute un travail. Aucune implémentation cron que j'ai vue ne vous permet d'utiliser différentes configurations de journalisation pour différents travaux.

Si vous souhaitez omettre certains travaux, votre seule option consiste à appliquer un filtrage de texte aux messages de journal dans le démon syslog. La norme de facto pour le filtrage syslog est d'exécuter rsyslog (qui peut ou non être la valeur par défaut sur votre système) en tant que démon syslog. Voir réponse de goldilocks pour savoir comment filtrer cette commande particulière.