Perl-Skript wird in Crontab oder Shell-Skript nicht richtig ausgeführt

Perl-Skript wird in Crontab oder Shell-Skript nicht richtig ausgeführt

Ich habe ein Perl-Skript (das mit meiner Vicidial-Dialer-Software geliefert wurde), das perfekt in der Linux-Befehlszeile läuft. Es sendet am Ende des Skripts eine E-Mail.

Das Skript erzeugt keine Fehler und das gesamte Skript bis hin zu sendmail (https://metacpan.org/pod/Mail::Sendmail) funktioniert ordnungsgemäß, wenn sie in Crontab und in einer ausführbaren Shell-Skriptdatei (als Root ausgeführt) ausgeführt wird, die E-Mail wird jedoch nicht gesendet.

Was ist der Unterschied zwischen der Ausführung des Skripts in einer Bash-ausführbaren Datei und in der Bash-CLI? Die Sendmail-Funktion wirft keine Fehler aus, warum sendet sie einfach nicht?

Hier sind zwei relevante Codeausschnitte aus dem Perl-Skript:

use MIME::QuotedPrint;
use MIME::Base64;
use Mail::Sendmail;
if (length($attachment)>0) {
    #print $mail{body};
    sendmail(%mail) or die $mail::Sendmail::error;
    #print "error: ";
    #print $mail::Sendmail::error;
}

So führe ich das Skript aus:

/usr/share/astguiclient/AST_email_web_report.pl --email-subject=XXXX--email-list=XXXX --email-sender=XXXX --date=XXXX

Antwort1

Allgemein ausgedrückt bedeutet „es funktioniert in der Shell eines Benutzers, aber nicht von crontab(oder in der Shell eines anderen Benutzers)“, dass das Problem dadurch verursacht wird, dass das Programm (sehr häufig PATH) auf Umgebungseinstellungen angewiesen ist, die der erste Benutzer vorgenommen hat, die in der cronUmgebung und der Shell des anderen Benutzers jedoch unterschiedlich sind oder fehlen.

Wenn ich in der von Ihnen beschriebenen Situation wäre, würde ich als Erstes den Perl-Code überprüfen, denn Perl ist mein Ding, und dann würde ich print "Back from sendmail\n";direkt nach dem einen Befehl einfügen sendmail(%mail) or die, nur um absolut sicherzugehen, dass das Programm beim Versuch, die E-Mail zu senden, nicht unbemerkt beendet wird. Aber ich nehme an, Sie haben diese Grundlagen wahrscheinlich bereits so gut abgedeckt, wie Sie können.

Als Nächstes führen Sie den envBefehl in der Shell aus, für die er funktioniert, und suchen in der Ausgabe nach Einstellungen, die relevant erscheinen könnten. Versuchen Sie dann, diese Einstellungen in die Shell-Umgebung von root zu übertragen, um zu sehen, ob die E-Mail dort funktioniert. Sobald Sie die Einstellung(en) identifiziert haben, mit denen es für root funktioniert, können Sie diese Einstellungen auch in die crontabDatei einfügen, und das sollte auch das Problem beheben.

Sie könnten auch in tail -fden Protokollen Ihres Mailservers nachsehen, ob dieser die Nachricht empfängt und dann verwirft (oder zurücksendet), aber das scheint ein ziemliches Wagnis und erfordert, dass Sie Zugriff auf die Protokolle des entsprechenden Mailservers haben. Umgebungsprobleme scheinen viel wahrscheinlicher, es sei denn, Sie erhalten Rückläufer von den fehlgeschlagenen Mailversuchen. (Suchen Sie im Postfach von root nach, falls Sie das nicht bereits getan haben!)

Antwort2

Ich habe einen Fehler im bereitgestellten Skript entdeckt, der dazu führte, dass eine Option aktiviert wurde, obwohl dies nicht der Fall sein sollte. Jetzt funktioniert alles normal.

verwandte Informationen