나는 Linux 명령줄에서 완벽하게 실행되는 Perl 스크립트(Vicidial 다이얼러 소프트웨어와 함께 제공됨)를 가지고 있습니다. 스크립트가 끝나면 이메일을 보냅니다.
스크립트는 오류를 생성하지 않으며 sendmail까지의 전체 스크립트(https://metacpan.org/pod/Mail::메일 보내기) 기능은 crontab 및 쉘 스크립트 실행 파일(루트로 실행)에서 실행될 때 올바르게 작동하지만 이메일은 보내지 않습니다.
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
일반적으로 말하면, "한 사용자의 셸에서는 작동하지만 (또는 다른 사용자의 셸에서는) 작동하지 않습니다. " 는 첫 번째 사용자가 설정했지만 다른 crontab
환경 설정(매우 자주)에 의존하는 프로그램으로 인해 문제가 발생한다는 것을 의미합니다. 또는 환경과 다른 사용자의 셸 PATH
에서 누락되었습니다 .cron
내가 당신이 묘사한 상황에 처했다면, 내가 가장 먼저 할 일은 Perl 코드를 검토하는 것입니다. 왜냐하면 Perl은 나의 것이기 때문입니다. 그런 다음 프로그램이 그렇지 않다는 것을 절대적으로 확인하기 위해 print "Back from sendmail\n";
바로 뒤에 명령을 넣을 것입니다. sendmail(%mail) or die
메일을 보내려고 할 때 자동으로 종료됩니다. 하지만 나는 당신이 할 수 있는 만큼 이미 그러한 기반을 다루었다고 가정합니다.
그 다음은 env
작동하는 셸에서 명령을 실행하고 관련성이 있는 것처럼 보이는 설정에 대한 출력을 살펴본 다음 해당 설정을 루트의 셸 환경에 이식하여 메일이 수신되는지 확인하는 것입니다. 거기에서 일해요. 루트에서 작동하도록 하는 설정을 식별한 후에는 동일한 설정을 파일에 넣을 수도 crontab
있으며 이 설정도 수정되어야 합니다.
조사할 수 있는 또 다른 방법은 tail -f
메일 서버 로그를 확인하여 메시지를 수신한 후 삭제(또는 반송)하는지 확인하는 것입니다. 하지만 이는 다소 시간이 걸릴 것으로 보이며 적절한 메일에 액세스해야 합니다. 서버의 로그. 실패한 메일 시도로 인해 반송 메일을 받지 않는 한 환경 문제가 발생할 가능성이 훨씬 더 높아 보입니다. (아직 확인하지 않았다면 루트의 메일함을 확인하세요!)
답변2
제공된 스크립트에서 옵션을 켜서는 안되는 옵션을 활성화하는 버그를 발견했습니다. 이제 모든 것이 정상적으로 작동하고 있습니다.