!/bin/sh -xv

!/bin/sh -xv

저는 센토스 7.0/6.5를 사용하고 있습니다. /etc/cron.hourly/mail.cron의 내용

#!/bin/sh
log=/var/log/mail.cron.log
echo "`hostname` `date`" >> $log 2>&1
mailx -s "test mail" [email protected] < $log

/var/log/mail.cron.log의 결과

myhost Mon Jul 28 11:01:01 CST 2014

그런데 제목이 맞는 빈 이메일을 받았습니다. 그래서 저는 이 cron을 수동으로 테스트합니다. 올바른 이메일 내용을 받았습니다.

myhost Mon Jul 28 11:01:01 CST 2014
myhost Mon Jul 28 11:30:29 CST 2014

관련 로그는 다음과 같습니다/var/로그/크론

Jul 28 11:01:01 myhost run-parts(/etc/cron.hourly)[24577]: starting mail.cron
Jul 28 11:01:02 myhost run-parts(/etc/cron.hourly)[24605]: finished mail.cron

이 문제를 디버깅하는 방법이 궁금합니다.

답변1

시도해 볼 몇 가지 사항입니다.

  1. !/bin/sh -xv

  2. 두 개의 보다 큰 기호 2>>&1을 사용하여 stderr를 리디렉션해 보세요.

첫 번째는 스크립트의 단계별 출력을 제공합니다. stderr를 로그 파일로 리디렉션하지 않고 먼저 시도해 보겠습니다. Cron은 출력 사본을 우편으로 보내드립니다. 어디가 잘못되었는지 정확히 알 수 있습니다.

두번째. 어쩌면 표준 출력을 방해하는 오류가 있습니까? (아마도 아닐 것입니다. CentOS 6.5에서와 같이 작동합니다.)

cat을 사용하여 인쇄할 수 없는 문자를 확인할 수도 있습니다.

cat -vet /etc/cron.hourly/mail.cron

시도해야 할 또 다른 방법은 명령에 절대 경로를 사용하는 것입니다. 즉, 에코 대신 /bin/echo, 날짜 대신 /bin/date, 호스트 이름 대신 /bin/hostname입니다. (ymmv) Jim은 cron이 항상 동일한 대화형 사용자로서 정확한 환경을 사용하지 않는다는 점에서 절대적으로 정확합니다.

답변2

귀하의 의견에 따라 작업이 작동한다고 확신합니다. cron그러나 로그인한 동안 작업을 수동으로 실행하여 테스트했습니다. 문제는 실행된 작업이 cron현재 사용자의 설정 및 환경 변수를 고려하지 않기 때문에 .bash_profile스크립트에서 이메일을 보내기 전에 한 단계로 사용자에 대한 설정 파일을 소싱해야 할 수도 있다는 것입니다.

스크립트를 다음과 같이 변경하세요.

#!/bin/sh
source $HOME/.bash_profile     # or whatever profile file or setting you are using
log=/var/log/mail.cron.log
echo "$(hostname) $(date)" >> $log
mailx -s "test mail" [email protected] < $log

cron쉘에 대해 아무것도 모릅니다. 시스템에 의해 시작되므로 최소한의 환경이 있습니다. 프로그램을 찾거나 시스템에 설치된 유틸리티를 실행할 수 있도록 하려면 먼저 해당 프로그램이 어디에 있는지 알려야 하며 .profile스크립트 시작 부분에서 변수를 설정하면 됩니다.

유용한 링크:

답변3

나는 당신이 몇 가지 답변을 얻었지만 명확한 답변을 얻지 못한 것을 보았습니다. 나에게 도움이 된 것은 cron을 다음과 같이 설정하는 것입니다.

*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; then echo "$body" | mail -s "Cron 스크립트 출력"[이메일 보호됨]; fi)

이것은 출력을 캡처하여 출력 없이 메일로 보냅니다. 스크립트에서 실행할 때에도 빈 이메일을 받습니다. (colucix에게 감사드립니다)

관련 정보