%20%EC%B6%9C%EB%A0%A5%EA%B3%BC%20%ED%95%A8%EA%BB%98%20%EC%9D%BC%EB%B0%98(stdout)%20%EC%B6%9C%EB%A0%A5%20%EC%BA%A1%EC%B2%98.png)
다음 줄을 사용하여 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 1(파이프의 쓰기 끝)이 지적한 것과 동일한 리소스를 가리키는 fd 2(stderr)가 있으므로 의 정상 출력과 오류 출력 모두 script.sh
파이프로 이동합니다 tee
.
tee
stdout(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
없이도 작업을 수행할 수 있습니다 .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가 어쨌든 같은 장소).
쉘( 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
또한 괄호를 제거했습니다. 하위 쉘에서 스크립트를 실행할 필요가 없습니다.