종료 상태에 따라 MAILTO에 cron 이메일 출력

종료 상태에 따라 MAILTO에 cron 이메일 출력

다음 PHP 명령을 실행하는 cron 작업이 있습니다.

php /path/to/script.php > dev/null

STDERR 출력만 MAILTO 주소로 보내야 합니다. 내가 아는 한, 종료 상태가 1이더라도 PHP 스크립트는 STDERR 정보를 출력하지 않습니다.

php 명령의 출력(STDOUT)을 가져와 종료 상태가 0이 아닌 경우에만 MAILTO로 보내는 방법은 무엇입니까?

답변1

php /path/to/script.php > logfile || cat logfile; rm logfile

표준 출력을 덤프하고 logfile스크립트가 실패하는 경우에만 출력합니다(0이 아닌 종료).

참고: 스크립트가 다음으로 출력될 수도 있는 경우stderrstderr그런 다음 로 리디렉션해야 합니다 stdout. 그렇지 않으면 종료 코드가 0이더라도 에 인쇄된 내용이 있으면 stderrcron이 이메일을 보냅니다.

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile

답변2

생각해 본 적 있어?만성병 환자~에서더 많은 유틸리티. 나는 그것이 당신이 원하는 것을 정확하게 수행한다고 생각합니다.

Chronic은 명령을 실행하고 명령이 실패하는 경우(0이 아닌 종료 또는 충돌)에만 표준 출력 및 표준 오류를 표시하도록 준비합니다. 명령이 성공하면 관련 없는 출력이 숨겨집니다.

-e최신 버전에는 stderr에 기록된 내용이 있으면 전체 출력을 표시하는 스위치도 있습니다.

답변3

종료 상태가 알려지기 전에 출력이 생성되므로 어딘가에 저장해야 합니다.

한 가지 가능성은 이를 쉘 변수에 저장하는 것입니다.

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

이렇게 하면 스크립트의 출력이 완전히 보존되지는 않지만(후행 공백 줄 제거) 이 사용 사례에서는 괜찮습니다. 후행 빈 줄을 유지하려면 다음을 수행하십시오.

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

출력량이 많을 경우 임시 파일에 저장하는 것이 좋습니다.

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi

관련 정보