Comment puis-je complètement faire taire un cronjob à / dev / null /?

72

Sur mon Ubuntu-Desktop et sur mon serveur Debian, j'ai un script qui doit être exécuté à la minute (un script qui appelle la minute de mon navigateur en ligne ).

Le problème est que sur les dérivés debian, cron enregistre /var/log/syslogchaque fois qu’il s’exécute. Je finis par voir répéter le message, il a été exécuté à plusieurs 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 travail cronjob et m'assurer que toutes les sorties générées ou les erreurs sont dirigées vers NULL, de sorte que cela ne génère aucun message dans syslog et ne génère aucun email.


EDIT:
il existe une solution pour rediriger les journaux cron dans un journal séparé comme proposé ici en modifiant/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 travail cron dans un fichier journal séparé? De préférence, configurable à l'intérieur du cron.hourlyfichier lui-même.

rubo77
la source
2
Vous pouvez aussi simplement mettre MAILTO=""au début du fichier cron. Cela supprimera tous les emails. Et je n’ai jamais entendu parler d’un démon cron qui envoie la sortie du travail à syslog (mais j’imagine que c’est possible).
Patrick
@Patrick - cela désactivera tout, ce qui pourrait être OK, mais soyez juste conscient. Voir ma mise à jour, vous pouvez définir plusieurs mailto.
slm
Oui, MAILTO=""comme la 1ère ligne de la crontab empêchera tout email. En outre, utilisez le trifecta complet sur vos lignes de commande si vous supprimez toutes les sorties. Les 3 types sont redirigés par cette chaîne: >/dev/null 2>&1 - Bien sûr, vous pouvez avoir le script inclut des écritures périodiques dans un journal séparé.
SDsolar

Réponses:

119

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 le courrier électronique en définissant, puis en réinitialisant le MAILTO=""qui désactivera l'envoi de courriers électroniques.

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 recevez les types de messages suivants /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 cronddirectement du démon. Vous ne pouvez rien y faire, et je vous encourage à ne pas les désactiver, car ils sont probablement la seule fenêtre sur laquelle vous avez accès crondvia les journaux.

S'ils vous ennuient beaucoup, vous pouvez toujours les diriger vers un fichier journal alternatif pour les extraire de votre /var/log/syslogfichier, via le /etc/syslog.conffichier de configuration de syslog.

slm
la source
@ rubo77 - pouvez-vous montrer un exemple? J'aurais besoin de voir ce qui ne fonctionne pas avec ça. Googling
slm
Cela fonctionne pour toutes les sorties et les emails, mais il génère toujours une ligne pour chaque appel cron dans / var / log / syslog
rubo77
@ rubo77 - c'est ce que je pensais que vous auriez pu demander. Vous ne pouvez pas arrêter ces messages, ils sont générés par le démon crond lui-même.
slm
@ rubo77 - Je suis conscient de changer /etc/syslog.conf, je considérerais difficilement cela comme une alternative. Cela changera simplement le fichier dans lequel les journaux seront vidés ou vous pourrez complètement désactiver les messages cron tous ensemble. Il n'y a pas moyen de faire ce que vous voulez.
slm
1
@ rubo77 - le seul moyen de faire ce que vous voulez, c’est de mettre un grep -v ...après l’invocation du crond.
slm
10

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

Puisque rien ne vous semble arrêter cela, il faut se demander: qu'est - ce 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 que quelque chose se connecte directement à syslog - soit cron, comme cela semble être implicite dans certains de vos commentaires, ou bien le processus exécuté par cron. Les messages envoyés à syslog ne proviennent pas de stdin ou stderr, ils 2>&1&>ne vous aideront donc pas.

Il y aurait peut-être un moyen de configurer le comportement de l'application en question, sauf que nous ne savons pas ce que c'est.

Il existe certainement un moyen de configurer la plupart des implémentations syslog actuelles (il en existe 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, comme nous ne savons rien du message en question, ni du syslogd que vous utilisez, aucun élément spécifique ne peut être recommandé.

Mon argument général est que si vous ne voulez pas rediriger / filtrer les messages parce que "cela redirige tous les messages", vous pouvez alors affiner la technique de filtrage. Le thread de défaillance du serveur auquel vous vous êtes lié mentionne simplement le filtrage par facility ( *.cron) - mais vous pouvez configurer des filtres plus spécialisés que cela.


Rsyslog est disponible pour Debian et Ubuntu . Sous Debian 5+, c'est le syslog par défaut, sous ubuntu, c'est une option, vous devez donc l'installer. Pour créer un filtre qui cible un type de contenu spécifique, placez- le en haut (c'est-à-dire avant toute autre règle, mais après la configuration générale, le chargement du module, etc.) de /etc/rsyslog.conf. La meilleure façon de le faire est de ne pas éditer le rsyslog.conffichier lui - même, mais de créer un fichier dans un /etc/rsyslog.conf.d/répertoire, dont le nom commence 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). Toutefois, le message sera toujours transmis aux règles suivantes qui l'envoient /var/log/syslog. Pour empêcher 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 rsyslogdaprès avoir changé la configuration (par exemple sur des systèmes systemd systemctl restart rsyslog):

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

HUP provoque le redémarrage du démon.

boucle d'or
la source
Pour rsyslog ~est maintenant obsolète et doit être remplacé par stop. La position dans le rsyslogd.conffichier est également importante. Donc, pour rsyslog, je voudrais simplement utiliser :msg, contains, "/usr/bin/w3m -no-cookie" stop. Et puis redémarrer sudo systemctl restart rsyslog.
Frank Breitling
4

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, la EXTRA_OPTSligne est""

Dallas
la source
2

Redirection pour /dev/nullmasquer la sortie de la commande. Si vous ne le faites pas, cron vous enverra la sortie par courrier électronique. La sortie de la commande ne finit jamais dans les journaux du système (du moins pas par le travail de cron).

Il est généralement déconseillé de rediriger la sortie /dev/null, en particulier la sortie d'erreur: en cas de problème, vous ne disposerez d'aucune information pour diagnostiquer le problème. Si vous ne souhaitez pas recevoir de courrier, redirigez-le vers un fichier journal.

Toutefois, rien de tout cela n’est pertinent pour 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 certaines tâches, votre seule option consiste à appliquer un filtrage de texte aux messages de journal du démon syslog. La norme de facto pour le filtrage syslog consiste à exécuter rsyslog (qui peut ou non être la valeur par défaut sur votre système) en tant que démon syslog. Voir la réponse de goldilocks pour savoir comment filtrer cette commande particulière.

Gilles, arrête de faire le mal
la source