종료 상태에 따라 cron 이메일이 MAILTO로 출력됩니다.


11

다음과 같은 PHP 명령을 실행하는 크론 작업이 있습니다.

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

STDERR 출력 만 MAILTO 주소로 보내야합니다. 내가 수집 한 PHP 스크립트는 종료 상태가 1 일 때도 STDERR 정보를 출력하지 않습니다.

종료 상태가 0이 아닌 경우 php 명령 (STDOUT)의 출력을 가져 와서 MAILTO로 보낼 수 있습니까?

답변:


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

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

참고 : 스크립트가로 출력 될 수도 있으면로 stderr리디렉션해야 stderr합니다 stdout. 그렇지 않으면 stderr종료 코드가 0 인 경우에도 인쇄 할 내용 이 있으면 cron에서 전자 메일을 보내 게됩니다.

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

이것은 stderr에 나타나는 모든 것에 대해서도 발생합니다. 반드시 오류가 있음을 의미하지는 않습니다 (예 : 디버그 출력).
hoffmanc

3

당신은 생각 해 봤나 만성 에서 moreutils . 나는 그것이 당신이 원하는 것을 정확하게 수행한다고 생각합니다 :

chronic은 명령을 실행하고 명령이 실패한 경우 (0이 아닌 종료 또는 충돌)에만 표준 출력 및 표준 오류가 표시되도록 정렬합니다. 명령이 성공하면 외부 출력이 숨겨집니다.

최근의 설명 -e에서 stderr에 작성된 것이 있으면 전체 출력을 표시 하는 스위치가 있습니다.


2

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

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

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