Wie kann ich einen Cronjob in / dev / null / vollständig zum Schweigen bringen?

72

Auf meinem Ubuntu-Desktop und auf meinem Debian-Server habe ich ein Skript, das jede Minute ausgeführt werden muss (ein Skript, das die Minutentaktik meines Space-Online-Browserspiels aufruft ).

Das Problem ist, dass cron auf Debian-Derivaten bei /var/log/syslogjeder Ausführung protokolliert . Am Ende habe ich die Nachricht wiederholt gesehen, in der sie immer und immer wieder ausgeführt wurde /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)

Ich weiß, dass ich, um die Ausgabe eines Programms zu unterdrücken, es umleiten kann /dev/null, um beispielsweise alle Fehler- und Warnmeldungen eines Programms auszublenden, eine Zeile in crontab wie dieser erstellen kann

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

Aber ich möchte einen Cronjob ausführen und sicherstellen, dass alle generierten Ausgaben oder Fehler auf NULL weitergeleitet werden, damit im Syslog keine Nachrichten und keine E-Mails generiert werden


BEARBEITEN:
Es gibt eine Lösung, um die Cron-Protokolle durch Ändern in ein separates Protokoll umzuleiten, wie hier vorgeschlagen/etc/syslog.conf

Der Nachteil ist jedoch, dass dann ALLE Ausgaben aller Cronjobs umgeleitet werden.

Kann ich irgendwie nur einen einzelnen Cronjob in eine separate Protokolldatei umleiten? Vorzugsweise in der cron.hourlyDatei selbst konfigurierbar .

rubo77
quelle
2
Sie können auch einfach MAILTO=""am Anfang der Cron-Datei setzen. Dadurch werden alle E-Mails unterdrückt. Und ich habe noch nie von einem Cron-Daemon gehört, der Job-Ausgaben an Syslog sendet (aber ich denke, es ist möglich).
Patrick
@Patrick - das deaktiviert alles, was in Ordnung sein könnte, aber sei dir nur bewusst. Siehe mein Update, Sie können mehrere Mailto's einstellen.
slm
Ja, MAILTO=""da die erste Zeile der Crontab alle E-Mails verhindert. Verwenden Sie auch das vollständige Trifecta in Ihren Befehlszeilen, wenn Sie die gesamte Ausgabe unterdrücken. Alle drei Arten werden durch diese Zeichenfolge umgeleitet: >/dev/null 2>&1 - Natürlich können Sie den Scrip auch in ein separates Protokoll schreiben lassen.
SDsolar

Antworten:

119

Machen Sie die folgende Zeile:

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

Dadurch werden sowohl STDOUT (1) als auch STDERR (2) erfasst und an gesendet /dev/null.

MAILTO

Sie können die E-Mail auch deaktivieren, indem Sie das festlegen und dann zurücksetzen, MAILTO=""wodurch das Senden von E-Mails deaktiviert wird.

Beispiel

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

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

Zusätzliche Nachrichten

Häufig werden die folgenden Nachrichtentypen angezeigt /var/log/syslog:

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

Dies sind einfach Benachrichtigungen über cron, dass ein Verzeichnis von cronjobs ausgeführt wurde. Diese Nachricht hat nichts direkt mit diesen Jobs zu tun, sondern kommt cronddirekt vom Daemon. Es gibt nicht wirklich etwas, was Sie dagegen tun können, und ich würde Sie ermutigen, diese nicht zu deaktivieren, da dies wahrscheinlich das einzige Fenster ist, das Sie crondüber die Protokolle in das Geschehen einweihen.

Wenn sie Sie sehr stören, können Sie sie jederzeit /var/log/syslogüber die /etc/syslog.confKonfigurationsdatei für in eine alternative Protokolldatei umleiten, um sie aus Ihrer Datei zu entfernen syslog.

slm
quelle
@ rubo77 - kannst du ein Beispiel zeigen? Ich müsste sehen, was damit nicht funktioniert. Googeln zeigt dies als Antwort an: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
slm
Dies funktioniert für alle Ausgaben und E-Mails, es wird jedoch für jeden Anruf in / var / log / syslog
rubo77
@ rubo77 - das ist es, worüber du nachgedacht hast. Sie können diese Nachrichten nicht stoppen, sie werden vom crond-Daemon selbst generiert.
slm
@ rubo77 - Mir ist bewusst, dass sich das ändert /etc/syslog.conf, ich würde das kaum als Alternative betrachten. Dadurch wird nur die Datei geändert, in der die Protokolle gespeichert werden, oder Sie können die Cron-Nachrichten vollständig deaktivieren. Es gibt keine Möglichkeit, das zu tun, was Sie wollen.
slm
1
@ rubo77 - der einzige Weg, auf dem du tun kannst, was du willst, ist, wenn du grep -v ...nach dem Aufrufen der ein setzt crond.
slm
10

habe ein Skript, das jede Minute ausgeführt werden muss. Das Problem ist, dass cron bei jeder Ausführung in / var / log / syslog protokolliert. Am Ende habe ich in / var / log / syslog gesehen, wie die Meldung wiederholt wurde, dass sie immer wieder ausgeführt wurde

Da nichts, was Sie tun, dies zu stoppen scheint, ist es sinnvoll zu fragen: Was genau ist dieses Skript und was genau ist die Meldung, die Sie im Syslog sehen?

Wenn der Vorschlag von slm nicht funktioniert hat, liegt das daran, dass etwas direkt in syslog protokolliert wird - entweder cron, wie in einigen Ihrer Kommentare angedeutet, oder der von cron ausgeführte Prozess. Nachrichten, die an syslog gesendet werden, stammen nicht von stdin oder stderr und 2>&1&>helfen daher nicht weiter.

Es gibt möglicherweise eine Möglichkeit, das Verhalten der betreffenden Anwendung zu konfigurieren, es sei denn, wir wissen nicht, was es ist.

Es gibt sicherlich eine Möglichkeit, die meisten aktuellen Syslog-Implementierungen (es gibt mehrere) so zu konfigurieren, dass Nachrichten sehr spezifisch gefiltert werden. Wenn in der Protokollnachricht beispielsweise ein eindeutiges Tag verwendet wird, können Sie dieses als Ziel festlegen. Da wir jedoch nichts über die bestimmte Nachricht oder das von Ihnen verwendete Syslogd wissen, gibt es nichts Spezielles, das empfohlen werden kann.

Mein allgemeiner Punkt ist, dass Sie die Filtertechnik verfeinern können , wenn Sie keine Nachrichten umleiten / filtern möchten, weil "dies alle Nachrichten umleiten wird" . Der Serverfehler-Thread, den Sie verlinkt haben, erwähnt nur das Filtern nach Einrichtung ( *.cron). Sie können jedoch spezialisiertere Filter konfigurieren .


Debian und Ubuntu haben beide rsyslog zur Verfügung. Unter Debian 5+ ist es das Standard-Syslog, unter Ubuntu ist es eine Option, daher müssen Sie es installieren. Um einen Filter zu erstellen, der auf einen bestimmten Inhalt abzielt, platzieren Sie diesen Filter oben (dh vor allen anderen Regeln, aber nach der allgemeinen Konfiguration, dem Laden von Modulen usw.) von /etc/rsyslog.conf. Der beste Weg, dies zu tun, besteht nicht darin, die rsyslog.confDatei selbst zu bearbeiten , sondern eine Datei im /etc/rsyslog.conf.d/Verzeichnis zu erstellen , deren Name mit zwei Ziffern beginnt, die kleiner als 50 sind, d /etc/rsyslog.conf.d/15-my-filter.conf. H. Sie können dort so etwas setzen:

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

Dadurch wird die Nachricht an gesendet /dev/null(oder an ein separates Protokoll, wenn Sie dies vorziehen). Die Nachricht wird jedoch weiterhin durch die nachfolgenden Regeln weitergeleitet, an die sie gesendet wird /var/log/syslog. Um das zu verhindern:

& stop

Unmittelbar nach dieser anderen Zeile. Dies wirft alles weg, was mit der vorhergehenden Regel übereinstimmt. Bei einzeiligen Regeln können Sie auch einfach stopdas Ende dieser Regelzeile hinzufügen .

Sie müssen rsyslogdnach dem Ändern der Konfiguration neu starten (z. B. auf systemd-Systemen systemctl restart rsyslog):

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

HUP veranlasst den Daemon, sich selbst neu zu starten.

Goldlöckchen
quelle
Denn rsyslog ~ist jetzt veraltet und sollte durch ersetzt werden stop. Auch die Position in der rsyslogd.confAkte ist von Bedeutung. Also für rsyslog würde ich einfach verwenden :msg, contains, "/usr/bin/w3m -no-cookie" stop. Und dann neu starten sudo systemctl restart rsyslog.
Frank Breitling
4

Veränderung /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"

Standardmäßig EXTRA_OPTSlautet die Zeile""

Dallas
quelle
2

Umleiten, um /dev/nulldie Ausgabe des Befehls auszublenden . Wenn Sie dies nicht tun, sendet cron die Ausgabe an Sie. Die Ausgabe des Befehls landet nie in Systemprotokollen (zumindest nicht von cron).

Es ist normalerweise eine schlechte Idee, die Ausgabe umzuleiten /dev/null, insbesondere die Fehlerausgabe: Wenn etwas schief geht, haben Sie keine Informationen, um das Problem zu diagnostizieren. Wenn Sie keine E-Mail erhalten möchten, leiten Sie zu einer Protokolldatei um.

Nichts davon ist jedoch für Ihr Problem relevant. Die Nachricht, die Sie zitieren, stammt von cron. Cron schreibt jedes Mal einen Protokolleintrag, wenn ein Job ausgeführt wird. Keine Cron-Implementierung, die ich gesehen habe, ermöglicht es Ihnen, unterschiedliche Protokollierungskonfigurationen für unterschiedliche Jobs zu verwenden.

Wenn Sie einige Jobs auslassen möchten, können Sie nur die Protokollmeldungen im Syslog-Daemon mit einer Textfilterung versehen. Der De-facto-Standard für die Syslog-Filterung ist die Ausführung von rsyslog als Syslog-Daemon. Siehe goldilocks Antwort dafür , wie diese besondere Befehl auszufiltern.

Gilles
quelle