Perl 스크립트가 crontab 또는 쉘 스크립트에서 제대로 실행되지 않습니다.

Perl 스크립트가 crontab 또는 쉘 스크립트에서 제대로 실행되지 않습니다.

나는 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

제공된 스크립트에서 옵션을 켜서는 안되는 옵션을 활성화하는 버그를 발견했습니다. 이제 모든 것이 정상적으로 작동하고 있습니다.

관련 정보