Perl 腳本在 crontab 或 shell 腳本中無法正確執行

Perl 腳本在 crontab 或 shell 腳本中無法正確執行

我有一個 Perl 腳本(隨我的 Vicidial 撥號器軟體一起提供),可以在 Linux 命令行中完美運行。它在腳本末尾發送一封電子郵件。

該腳本不會產生任何錯誤,整個腳本直到 sendmail (https://metacpan.org/pod/Mail::Sendmail) 函數在 crontab 和 shell 腳本可執行檔(以 root 身分執行)中執行時可以正常運作,但電子郵件不會傳送。

在 bash 可執行檔中執行腳本與在 bash CLI 中執行腳本有什麼不同? sendmail 函數沒有拋出任何錯誤,為什麼它不發送?

以下是 Perl 腳本中的兩個相關程式碼片段:

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;
}

這就是我運行腳本的方式:

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

答案1

一般來說,「它在一個使用者的 shell 中工作,但不能從crontab(或在另一個使用者的 shell 中)工作」意味著問題是由依賴PATH第一個使用者已到位但不同的環境設定的程式(經常)引起的或在cron環境和其他使用者的 shell。

如果我處於你描述的情況,我要做的第一件事就是檢查 Perl 代碼,因為 Perl 是我的菜,然後我會print "Back from sendmail\n";在 後面立即放置一個命令sendmail(%mail) or die,只是為了絕對確定該程序不是嘗試發送郵件時靜默退出。但我想您可能已經盡可能地了解了這些基礎知識。

接下來,就是env在適用的 shell 中運行該命令,並查看輸出以查找可能相關的任何設置,然後嘗試將這些設置移植到 root 的 shell 環境中以查看它們是否收到郵件在那裡工作。一旦您確定了使其適用於 root 的設置,那麼您也可以將這些相同的設置放入文件中crontab,它也應該可以修復該問題。

您可以調查的另一個途徑是查看tail -f您的郵件伺服器日誌,看看它是否可能正在接收郵件,然後丟棄(或退回)它,但這似乎有點不太可能,並且需要您有權訪問適當的郵件伺服器的日誌。環境問題似乎更有可能發生,除非您收到因郵件嘗試失敗而退回的郵件。 (如果您還沒有這樣做,請檢查 root 的郵箱!)

答案2

我在提供的腳本中發現了一個錯誤,該錯誤允許在不應該打開的情況下打開選項。現在一切正常。

相關內容