다음 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이 아닌 종료).
참고: 스크립트가 다음으로 출력될 수도 있는 경우stderr
stderr
그런 다음 로 리디렉션해야 합니다 stdout
. 그렇지 않으면 종료 코드가 0이더라도 에 인쇄된 내용이 있으면 stderr
cron이 이메일을 보냅니다.
php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
답변2
답변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