2009-09-08 7 views
18

Ich habe einige Python-Skripte, die täglich in Cron laufen. Wie kann ich cron haben, senden Sie mir eine E-Mail NUR WENN ES STDERR OUTPUT von meinem Skript ist? Ich möchte in der Lage sein, mehrere Empfänger zu mailen und die Betreffzeile für jeden Cron-Eintrag individuell festzulegen.Cron senden E-Mail mit STDERR aber nicht STDOUT?

Ich versuchte dies:

./prog > /dev/null | mail . . . 

aber es hat nicht funktioniert - ich immer noch leer E-Mails erhalten, wenn es keine STDERR ist. Muss ich das im Skript selbst tun?

Tut mir leid, wenn das einfach erscheint, habe ich viel gegoogelt, aber ich kann nicht finden, dass diese sucintly beantwortet.

Antwort

8

Der Dateitest -s wird Ihnen sagen, ob eine Datei existiert und eine Größe größer als Null hat.

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi 
+0

Ich endete mit einer Variante dieses Ansatzes. Danke mobrule – g33kz0r

+0

fand einen guten Artikel dazu, der mir half .. http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ – ishan

23

Für Cron müssen Sie nicht durch Mail pipen. Der Cron-Daemon wird automatisch jede Ausgabe Ihres Befehls an Sie senden. Ihre crontab-Eintrag sollte wie folgt aussehen:

# every minute 
* * * * * ./prog >/dev/null 

Wenn es keine STDERR ausgegeben wird, werden Sie keine E-Mail bekommen.

+1

"Wenn es keine STDERR-Ausgabe gibt, werden Sie keine Mail erhalten." Das stimmt, wenn ich MAILTO = "me @ mine" setze. Es ist jedoch NICHT wahr, wenn es zur Post (1) geleitet wird. "Zusätzlich zu LOGNAME, HOME und SHELL, Cron wird MAILTO betrachten, wenn es Grund hat, Mail als Ergebnis der Ausführung von Befehlen in diesem 'Crontab' zu senden." - http://ss64.com/osx/contab.html Allerdings muss ich das _subject_ der E-Mail festlegen, und es gibt keine Möglichkeit, dies (IMHO) mit Cron selbst zu tun. Also bin ich mit der Post unterwegs, die uns zu meiner ursprünglichen Frage zurückführt. – g33kz0r

+1

Das Problem mit diesem Ansatz ist, dass 'stdout' im Falle eines Fehlers keine nützliche Information enthält.'cronic' Lösung hat für mich besser funktioniert. –

12

Mail v1.6 hat eine Option, um keine Nachrichten mit einem leeren Körper zu senden:

-E  Do not send messages with an empty body. 
     This is useful for piping errors from cron(8) scripts. 

Dies könnte das sein, was Sie suchen.

15

Sie stellen eine falsche Frage. Wenn Sie mail (1) verwenden, um die E-Mail zu senden, ist es nicht mehr relevant, dass sie in cron ist. Was Sie wirklich brauchen, ist stderr zu stdin der Post zu pumpen. Normale Rohr ist von stdout zu stdin, so einfachste Art und Weise zu lösen diese Umleitung ist:

{ /prog > /dev/null ; } 2>&1 | mail ...

Oder in dem weniger klaren Weg wegen verwirrend Reihenfolge des redirectings:

/prog 2>&1 > /dev/null | mail ...

+1

Große Antwort und die richtige Technik um sowohl stderr als auch stdout an den mail-Befehl zu verweisen. Das zweite Beispiel löscht stdout auf dem Boden und sendet stderr nur an den Mail-Befehl. –

+0

Ich denke, das war die Absicht. –

8

Es ist ein nettes Werkzeug namens cronic, das dies tut. Es ist Teil des moreutils Pakets.

+2

Auf meinem Ubuntu 12.04 ist es '' chronic'' (nicht '' cronic''), das in '' moreutils'' gebündelt ist, es ist eher in Perl als in bash geschrieben, scheint aber den gleichen Zweck zu haben. Danke trotzdem ! – vaab

+1

"chronisch" scheint sowohl STDOUT als auch STDERR auszugeben, wenn das Programm mit einem Fehler beendet wird, oder keines, wenn das Programm sauber beendet wird. Das hat bei mir nicht funktioniert. Ich wollte eine 'chronic', die STDOUT unabhängig vom Exit-Code filtert. Eine einfache Weiterleitung funktionierte am besten für mich. – richardkmiller

+1

Beachten Sie, dass das Verhalten von "chronisch" und "chronisch" unterschiedlich ist: "chronisch" ("mehrdeutig", Perl) gibt nichts aus, wenn der Beendigungscode 0 ist, selbst wenn etwas auf STDERR war. 'cronic' ([habilis.net] (http://habilis.net/cronic/), bash) gibt alles aus, wenn es etwas auf STDERR gab, selbst wenn der Exit-Code 0 ist. – Qtax

-2

Wenn Ihr SCRIPT Befehle hat, die STDERR erzeugen können, auf dem Sie benachrichtigt werden möchten, dann müssen Sie einen Mail- oder Mailx-Aufruf innerhalb des Skripts selbst verwenden (wenn sonst else oder). Die Cronjob-STDOUT- und STDERR-Redirects sind NUR für Cronjob AUSFÜHRUNG STDOUT und STDERR. hkmaly hatte es richtig auf die n

+3

dann, warum hvmalys antworten Sie nicht upvote ? Das fügt nichts hinzu – g33kz0r