오류(stderr) 출력과 함께 일반(stdout) 출력 캡처

오류(stderr) 출력과 함께 일반(stdout) 출력 캡처

다음 줄을 사용하여 cron을 통해 실행되는 스크립트가 있습니다.

0 * * * * (/var/script.sh | tee -a /var/script.log)

stdout정상 출력 과 오류 출력을 모두 캡처하려면 cron 항목을 어떻게 다시 작성해야 합니까 stderr? 그들은 다른 파일에 배치됩니다.

답변1

cron작업은 기본적으로 실행되며 Bourne, POSIX 또는 호환 여부 sh에 관계없이 구문은 다음과 같습니다.shsh

0 * * * * /var/script.sh 2>&1 | tee -a /var/script.log

여기서 |양쪽의 두 명령은 왼쪽 명령의 stdout(fd 1)이 파이프의 쓰기 끝 부분에 연결되고 오른쪽 명령의 stdin(fd 0)이 연결된 파이프와 병렬로 실행됩니다. 독서 끝.

2>&1왼쪽에 추가하면 fd 1(파이프의 쓰기 끝)이 지적한 것과 동일한 리소스를 가리키는 fd 2(stderr)가 있으므로 의 정상 출력과 오류 출력 모두 script.sh파이프로 이동합니다 tee.

teestdout(cron 작업의 경우 사용자에게 이메일을 보내는 데 사용되는 파이프 또는 임시 파일)과 script.log.

해당 구문은 셸에서도 작동합니다 fish.

(t)csh, zsh또는 bash(4.0 이상)을 사용하면 다음을 수행할 수도 있습니다.

SHELL=/bin/zsh # or tcsh, bash ...
0 * * * * /var/script.sh |& tee -a /var/script.log

( 명령줄을 해석하기 위해 다른 쉘을 사용하도록 SHELL=/bin/zsh지시하는 방법은 어디에 있습니까 ?)cron

에서는 대신에 를 fish사용합니다 .&||&

rc(의 후계자가 될 때 sh) 또는 파생어의 구문은 다음과 같습니다 .

SHELL=/bin/rc # or es, akanga
0 * * * * /var/script.sh >[2=1] | tee -a /var/script.log

을 사용하면 다음 기능 덕분에 zsh없이도 작업을 수행할 수 있습니다 .teeMULT_IOS

SHELL=/bin/zsh
0 * * * * /var/script.sh >&1 2>&2 >>& /var/script.log

script.sh이는 또한 의 종료 상태를 유지하는 이점이 있으며 script.sh또한 의 stderr이 원래 stderr로 이동하도록 유지합니다 script.log(그러나 이는 일반적으로 stdout 및 stderr가 어쨌든 같은 장소).

쉘( bash, ksh93, zsh, yash, mksh적어도) 과 같은 Bourne/POSIX pipefail에는 파이프라인의 모든 구성 요소에서 오류를 보고하는 데 사용할 수 있는 옵션이 있습니다.

SHELL=/bin/ksh # or zsh, bash...
0 * * * * set -o pipefail && /var/script.sh 2>&1 | tee -a /var/script.log

답변2

cron은 출력을 생성하는 모든 cron 작업에 대해 알려주고 싶어합니다. 결과를 이메일로 보내려고 합니다. cron에서 이메일을 받지 않으려면 작업에서 출력이 생성되지 않도록 하세요. 를 사용하지 말고 tee출력을 리디렉션하세요.

0 * * * * /var/script.sh >> /var/script.log 2>&1

또한 괄호를 제거했습니다. 하위 쉘에서 스크립트를 실행할 필요가 없습니다.

관련 정보