우분투에서 (실패한) 크론 작업에서 전자 메일을 얻는 방법은 무엇입니까?


45

실행 파일 중 하나에 배치하여 우분투에서 크론 작업을 만듭니다 /etc/cron.{daily,hourly,monthly,weekly}. cron으로 시작하는 많은 디렉토리가 있습니다 :

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

다음과 같은 경우 스크립트에서 전자 메일을 받고 싶습니다.

  1. 스크립트가 실패하고 0이 아닌 종료 코드를 제공합니다.
  2. 스크립트에는 나에게 할 말이있다

나는이 SSMTP이 설치 작업, 내 구글 계정에서 내 메일을 보내주십시오. SSMTP가 하나의 계정으로 만 메일을 보낼 수 있다는 사실은 문제가되지 않습니다. 그것은 단지 홈 서버이며 크론 작업을 추가 할 수없는 사용자입니다.

스크립트 메일 링이 일반적으로 Linux / Unix 및 우분투에서 어떻게 작동하는지 알고 싶습니다. 또한 위의 두 가지 상황에서 메일을받을 수있는 좋은 방법을 알고 싶습니다.

답변:


60

기본적으로 cron은 crontab이 실행되고있는 계정의 소유자에게 이메일을 보냅니다.

시스템 전체 crontab은 / etc / crontab에 있으며`root '사용자로 실행됩니다.

root가 널리 사용되므로 어쨌든 / etc / aliases 파일에 루트 별칭을 추가하는 것이 좋습니다. ( 'newaliases'실행 후)

이것을 구성하는 일반적인 방법은 루트를 시스템의 다른 사용자에게 알리는 것입니다. 예를 들어, 'root'는 'phil'(내 사용자 계정)으로, 그리고 'phil'은 외부 전자 메일 주소로 별칭을 지정합니다.

출력시 이메일을 보내려는 특정 사용자 cron이있는 경우 / etc / aliases를 다시 사용하여 (수퍼 유저 액세스 권한을 제공) 사용자를 다른 이메일 주소로 리디렉션하거나 다음에서 다음을 사용할 수 있습니다. crontab의 상단 :

MAILTO="email@domain.com"

메일을 로컬 사용자에게 보내야하는 경우 사용자 이름 만 입력하면됩니다.

MAILTO=someuser

자세한 정보가 필요하면 다음을 실행하여 crontab (5)를 참조하십시오.

man 5 crontab

아닌가 /etc/aliases에 따라 가정 항목 형식을 name: value1, value2, ... ? 모르겠습니다. 어쩌면 지난 8 년 동안 형식이 변경되었을 수 있습니다.
Nathan Jones

1
"저는 'root'별칭을 'phil'(내 사용자 계정)로, 별칭 'phil'을 외부 이메일 주소로 별칭으로 지정했습니다." 'phil'을 외부 이메일 주소로 별칭 지정하는 방법은 무엇입니까?
Howard Lee

29

vixie cron에서 이메일을 보내려면 sendmail 명령을 복제하는 것이 필요합니다. 따라서 postfix 또는 SSMTP를 설치하면이 부분이 정렬됩니다. postfix를 사용하는 경우 별명 파일을 사용하여 시스템 사용자를 실제 이메일 주소에 맵핑 할 수 있습니다.

crontab 상단에 MAILTO = "foo@bar.com"을 추가하면 cron 작업의 출력이 이메일로 전송됩니다. 이것은 오류 코드와 관계가 없습니다.

STDERR에 오류를 올바르게 출력하는 스크립트의 경우 오류가 발생했을 때만 이메일을 쉽게 보낼 수 있습니다.

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

STDOUT 만 null로 리디렉션합니다. STDERR 메시지가 있으면 이메일을 보내드립니다.

그러나 일부 스크립트는 STDOUT으로 오류를 잘못 출력하고 종료 코드를 1로 설정했습니다. 출력을 얻는 방법을 찾지 못했지만 종료 코드가 0 인 경우 출력을 무시합니다. 유일한 방법 출력을 파일로 리디렉션하고 종료 코드가 0이 아닌 경우 cron이 가져올 파일을 출력하는 것으로 생각할 수 있습니다. 그래도 꽤 끔찍한 것 같습니다.



8

모든 출력 (stdout 및 stderr)을 특정 주소로 보내려면 MAILTO변수를 사용할 수 있습니다 . 예를 들어, 스크립트 맨 위에 다음을 배치하십시오.

MAILTO="address@example.com"

5

/ etc / aliases에 "root : your@email.address"를 추가하십시오

해당 사용자의 모든 메시지를 이메일로 보냅니다. 모든 메시지를 원하지 않으면이를 위해 특별히 사용자를 만들 수 있습니다.

스크립트가 무언가를 출력하는 한 메일을 받게됩니다.



2

나는 SSMTP가 당신이해야 할 일에 달려 있다고 생각하지 않습니다. cron 프로세스에서 메일을 "수신"한 다음 실제 메일 함으로 보낼 수있는 것이 필요합니다.

나는 Sendmail을 사용하지만, 나는 오래된 태양 손이기 때문입니다. 요즘 Postfix를 사용하는 모든 멋진 아이들이 그것을 비웃습니다. 우분투 커뮤니티는 메일 시스템 설정을 안내 할 수 있습니다.


ssmtp 구현 / bin / sendmail
bobpaul

2

대안-모든 루트 메일을 일부 파일에 보관 한 다음 원본 메일을 삭제합니다.

나는 스크립트를 작성합니다 (핵심 부분이 있습니다)-

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

이것은 일을 깔끔하게 유지하고 계속 지켜 볼 수 있습니다. 매일 메일 파일을 외부 이메일 ID 등으로 이메일로 보낼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.