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

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

다음 줄을 포함하는 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 2(stderr)가 fd 1이 가리키는 것과 동일한 리소스, 즉 파이프의 쓰기 끝을 가리키도록 만듭니다. 따라서 정상 출력과 오류 출력 모두 script.sh파이프로 이동 합니다 tee.

tee표준 출력(크론 작업의 경우 사용자에게 이메일을 보내는 데 사용되는 파이프 또는 임시 파일)과 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.shstderr을 원래 stderr로 유지하는 이점도 있습니다 script.log(물론 stdout과 stderr가 일반적으로 같은 위치로 이동하는 cron 작업에서는 큰 차이가 없지만).

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

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

또한 괄호를 제거했다는 점에 유의하세요. 하위 쉘에서 스크립트를 실행하는 것은 의미가 없습니다.

관련 정보