메일 stderr 출력, cron에 stderr+stdout 기록

메일 stderr 출력, cron에 stderr+stdout 기록

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 명령을 제거하면 로그 파일의 순서가 다소 혼란스러워집니다.

관련 정보