다음 줄을 포함하는 cron을 통해 실행되는 스크립트가 있습니다.
0 * * * * (/var/script.sh | tee -a /var/script.log)
stdout
정상 출력 과 오류 출력을 모두 캡처하려면 cron 항목을 어떻게 다시 작성해야 합니까 stderr
? 그들은 다른 파일에 배치됩니다.
답변1
cron
작업은 Bourne, POSIX 또는 호환 여부 sh
에 관계없이 기본적으로 실행되며 구문은 다음과 같습니다.sh
sh
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
는 다음과 같습니다 .tee
MULT_IOS
SHELL=/bin/zsh
0 * * * * /var/script.sh >&1 2>&2 >>& /var/script.log
script.sh
이는 종료 상태를 보존하고 script.sh
stderr을 원래 stderr로 유지하는 이점도 있습니다 script.log
(물론 stdout과 stderr가 일반적으로 같은 위치로 이동하는 cron 작업에서는 큰 차이가 없지만).
쉘(적어도 bash
)과 같은 일부 Bourne/POSIX에는 파이프라인의 모든 구성 요소에서 오류를 보고하는 데 사용할 수 있는 옵션이 있습니다.ksh93
zsh
yash
mksh
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
또한 괄호를 제거했다는 점에 유의하세요. 하위 쉘에서 스크립트를 실행하는 것은 의미가 없습니다.