!/bin/sh -xv

!/bin/sh -xv

Ich verwende CentOS 7.0/6.5. Der Inhalt von /etc/cron.hourly/mail.cron

#!/bin/sh
log=/var/log/mail.cron.log
echo "`hostname` `date`" >> $log 2>&1
mailx -s "test mail" [email protected] < $log

Das Ergebnis von /var/log/mail.cron.log

myhost Mon Jul 28 11:01:01 CST 2014

Aber ich habe eine leere E-Mail mit korrektem Betreff erhalten. Also teste ich diesen Cron manuell. Ich habe den korrekten E-Mail-Inhalt erhalten.

myhost Mon Jul 28 11:01:01 CST 2014
myhost Mon Jul 28 11:30:29 CST 2014

Hier ist das zugehörige Protokoll/var/log/cron

Jul 28 11:01:01 myhost run-parts(/etc/cron.hourly)[24577]: starting mail.cron
Jul 28 11:01:02 myhost run-parts(/etc/cron.hourly)[24605]: finished mail.cron

Ich frage mich, wie ich dieses Problem beheben kann.

Antwort1

Ein paar Dinge zum Ausprobieren.

  1. !/bin/sh -xv

  2. Versuchen Sie, stderr mit zwei Größer-als-Zeichen umzuleiten, 2>>&1 .

Die erste gibt Ihnen eine schrittweise Ausgabe Ihres Skripts. Ich würde es zunächst versuchen, ohne stderr auf Ihre Protokolldatei umzuleiten. Cron sollte Ihnen eine Kopie der Ausgabe per E-Mail schicken. Sie können genau sehen, wo es schief läuft.

Der zweite. Vielleicht liegt ein Fehler vor, der Ihre Standardausgabe überlastet? (Wahrscheinlich nicht, es funktioniert so, wie Sie es in CentOS 6.5 haben.)

Sie können auch mit „cat“ nach nicht druckbaren Zeichen suchen.

cat -vet /etc/cron.hourly/mail.cron

Sie können auch versuchen, absolute Pfade für Ihre Befehle zu verwenden, also /bin/echo statt echo, /bin/date statt date, /bin/hostname statt hostname. (ymmv) Jim hat absolut Recht, dass cron nicht immer genau die gleiche Umgebung verwendet wie derselbe interaktive Benutzer.

Antwort2

Sie sind sicher cron, dass der Job gemäß Ihren Kommentaren funktioniert. Sie haben ihn jedoch getestet, indem Sie den Job manuell ausgeführt haben, während Sie angemeldet waren. Die Sache ist, dass die ausgeführten Jobs crondie Einstellungen und Umgebungsvariablen Ihres aktuellen Benutzers nicht berücksichtigen. Daher müssen Sie wahrscheinlich die .bash_profileEinstellungsdatei für den Benutzer als Schritt vor dem Senden der E-Mail in Ihrem Skript abrufen.

Ändern Sie Ihr Skript wie folgt:

#!/bin/sh
source $HOME/.bash_profile     # or whatever profile file or setting you are using
log=/var/log/mail.cron.log
echo "$(hostname) $(date)" >> $log
mailx -s "test mail" [email protected] < $log

cronweiß nichts über Ihre Shell - sie wird vom System gestartet und verfügt daher über eine minimale Umgebung. Wenn Sie möchten, dass sie Ihre Programme findet oder auf Ihrem System installierte Dienstprogramme ausführt, müssen Sie ihr zunächst mitteilen, wo sich diese befinden. Dies können Sie tun, indem Sie die .profileVariablen am Anfang Ihres Skripts festlegen.

Einige nützliche Links:

Antwort3

Ich habe gesehen, dass Sie einige Antworten erhalten haben, aber keine klare, funktionierende Antwort. Was bei mir funktioniert hat, war, den Cron folgendermaßen einzustellen:

*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; then echo "$body" | mail -s "Cron-Skript-Ausgabe"[email geschützt]; fi)

Dadurch wird die Ausgabe erfasst und per E-Mail gesendet. Ohne diese Funktion erhalte ich eine leere E-Mail, selbst wenn es in einem Skript ausgeführt wird. (danke an colucix)

verwandte Informationen