stdout+stderr을 올바른 순서로 파일에 기록하면서 cron이 stderr 출력만 메일로 보내기를 원합니다.
티셔츠니 뭐니 이것저것 가지고 놀았는데 뭔가 좀 안맞네요...
명령을 쉘 스크립트로 감싸십시오.
좋다
#!/bin/bash
mycommand | maybe_some_shell_redirect_magic >> /var/log/mycommand.log
답변1
나는 이것이 가능하다고 생각합니다. 라인 순서를 유지하면서 (즉, stderr는 그것을 작성하는 프로세스 내에서 복사됩니다) POSIX 쉘을 사용하더라도 마찬가지입니다. 노력하다:
#!/bin/sh
exec 3>log
command args ... 2>&1 >&3 |while read err; do
echo "$err" >&2
echo "$err" >&3
done
답변2
stdout과 stderr를 분리할 때 순서를 정확하게 유지하는 것은 불가능합니다. stdout 및 stderr 출력이 시간상 너무 가깝지 않은 한 합리적인 결과를 얻을 수 있습니다.
mycommand 2>>/var/log/mycommand.log | tee -a /var/log/mycommand.log
테스트를 위해 mycommand 대신 이 스크립트를 사용할 수 있습니다.
#!/bin/bash
echo stdout 1
sleep 0.1
echo stderr 1 >&2
sleep 0.1
echo stdout 2
sleep 0.1
echo stderr 2 >&2
sleep 명령을 제거하면 로그 파일의 순서가 다소 혼란스러워집니다.