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/syslog
jeder 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.hourly
Datei selbst konfigurierbar .
quelle
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).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.Antworten:
Machen Sie die folgende Zeile:
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
Zusätzliche Nachrichten
Häufig werden die folgenden Nachrichtentypen angezeigt
/var/log/syslog
: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
crond
direkt 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 Siecrond
ü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.conf
Konfigurationsdatei für in eine alternative Protokolldatei umleiten, um sie aus Ihrer Datei zu entfernensyslog
.quelle
/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.grep -v ...
nach dem Aufrufen der ein setztcrond
.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, diersyslog.conf
Datei 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: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:Unmittelbar nach dieser anderen Zeile. Dies wirft alles weg, was mit der vorhergehenden Regel übereinstimmt. Bei einzeiligen Regeln können Sie auch einfach
stop
das Ende dieser Regelzeile hinzufügen .Sie müssen
rsyslogd
nach dem Ändern der Konfiguration neu starten (z. B. auf systemd-Systemensystemctl restart rsyslog
):HUP veranlasst den Daemon, sich selbst neu zu starten.
quelle
~
ist jetzt veraltet und sollte durch ersetzt werdenstop
. Auch die Position in derrsyslogd.conf
Akte ist von Bedeutung. Also für rsyslog würde ich einfach verwenden:msg, contains, "/usr/bin/w3m -no-cookie" stop
. Und dann neu startensudo systemctl restart rsyslog
.Veränderung
/etc/default/cron
Standardmäßig
EXTRA_OPTS
lautet die Zeile""
quelle
Umleiten, um
/dev/null
die 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.
quelle