crontab에서 이메일을 전달하는 POSIX(또는 휴대용) 방법

crontab에서 이메일을 전달하는 POSIX(또는 휴대용) 방법

IRIX/Linux/macOS/FreeBSD용 설치 프로그램/업데이트 스크립트가 있는데 그 호환성을 Solaris로 확장하고 싶습니다.

crontab다음과 같이 생성된 부분을 제외하고 POSIX와 호환되지 않는 일부 부분을 수정했습니다 .

printf '%s\n' [email protected] '*/15 * * * * /path/cmd' | crontab -
# crontab -l # (on Linux/macOS/FreeBSD)
[email protected]
*/15 * * * * /path/cmd

노트: /path/cmd문제가 발견되지 않는 한 매우 조용함

이 코드는 다음 세 가지 이유로 Solaris에서 실패합니다.

  1. MAILTO=구문 오류 발생
  2. */15구문 오류 발생
  3. crontab -다음 이름의 파일을 열어 보십시오.-

나는 그것을 해결했다#2그리고#삼그리고:

printf '%s\n' '0,15,30,45 * * * * /path/cmd' | crontab
# crontab -l
0,15,30,45 * * * * /path/cmd

이제 그 부분을 어떻게 변환하는지 모르겠습니다 MAILTO=. 에서 이메일을 전달하는 POSIX 방법은 무엇입니까 crontab?


선택된 해결 방법:

감사해요@ilkkachu그리고@Gilles'SO-사악함을 멈추세요'포인터, 그게 내가 결정한 방법이야시뮬레이션crontab은 MAILTOPOSIX 호환 방식으로 작동합니다.

# crontab -l
0,15,30,45 * * * * out=$(/path/cmd 2>&1); [ -n "$out" ] && printf \%s\\n "$out" | mailx -s "Cron <$LOGNAME@$(uname -n)>" [email protected]

printf그러나 이 솔루션에는 잠재적인 문제가 있습니다.아니요내장 쉘그리고출력이 너무 크면 Argument list too long다음과 같은 오류와 함께 실패합니다.

답변1

지원되는 경우에도 이는 MAILTO전역 설정이므로 소프트웨어 설치 프로그램에는 이점이 없습니다. 소프트웨어에 의해 추가된 항목뿐만 아니라 crontab의 모든 항목에 적용됩니다.

소프트웨어가 다른 주소로 이메일을 보내도록 하려면 자신의 코드에서 이를 처리해야 합니다. 이는 종료 상태 및 빈 출력에 대한 논리를 직접 처리해야 함을 의미합니다.

다음은 이 논리를 구현하는 테스트되지 않은 코드입니다. 개행 문자를 공백으로 바꾸고(또는 단순히 제거하고) crontab 파일의 한 줄에 넣습니다.

out=$(mktemp) &&
/path/cmd >"$out" 2>&1;
status=$?;
if [ "$status" -ne 0 ] || [ -s "$out" ]; then
  mailx -s "/path/cmd exited with status $status" [email protected] <"$out";
fi;
rm -- "$out";

코드는 POSIX 기능과 널리 사용되는 기능만 사용합니다.mktemp. 안타깝게도 IRIX에서는 사용할 수 없습니다. IRIX에 POSIX 호환 m4가 있는 경우이것을 사용하여 달성할 수 있습니다.mktemp. 대체 방법으로 임시 파일을 사용자의 홈 디렉터리 아래 어딘가에 저장하거나 다른 디렉터리만 쓸 수 있는 다른 디렉터리에 저장할 수 있습니다. 다음과 같이 공유 디렉터리에 예측 가능한 이름을 가진 임시 파일을 만들지 마십시오 /tmp.그거 안전하지 않아.

관련 정보