stderr이 파일에 추가되는 방식 사용자 정의

stderr이 파일에 추가되는 방식 사용자 정의

rsync를 사용하여 2개의 디렉터리를 동기화하는 쉘 스크립트에 대한 질문이 있습니다. rsync 명령의 결과(성공 여부에 관계없이)를 status라는 파일에 저장하고, 문제가 발생하면 stderr 출력이 error라는 파일에 추가됩니다. 그러나 오류 파일에서 실제 오류 이전의 타임스탬프를 입력하는 방법을 찾을 수 없는 것 같습니다.

마지막으로 다음과 같은 것이 필요합니다.

if rsync source destination 2>> error # but I need to have the date before the actual error is appended!
then
   echo "`date` - Success" >> status
else
   echo "`date` - Failure" >> status
fi

또한 다음을 시도했습니다.

(rsync source destination && echo "`date` - Success" >> status || echo "`date` - Failure" >> status) 2>>error

이 작업을 수행할 수 있는 유일한 방법은 stderr 출력을 임시 파일에 저장하여 타임스탬프가 입력된 후 내용이 오류 파일에 추가되도록 하는 것입니다.

답변1

이것을 시도해 보셨나요?

rsync -av blah blah 2>&1|perl -e "while(<>){s/^/`date`  /g; print;}" >>logfile

줄 시작 부분에 날짜와 공백이 추가됩니다.

답변2

이 질문을 한 지 3개월이 넘었다는 걸 알지만, 결국 제가 한 일을 쉘 스크립트로 보여주면 좋겠다고 생각했습니다.

설명했듯이 타임스탬프 추가와 같이 로그 파일에서 조작할 수 있도록 어떤 방식으로든 stderr을 캡처해야 합니다. 파일을 사용하고 Patrick의 제안에 따라 이 작업을 수행할 수 있지만 가능한 한 간단하게 만들고 싶습니다.

그래서 이것이 내 해결책입니다.

if ! result=$(command_that_will_produce_errors 2>&1 1>/dev/null)
then
    echo "There was an error on $(date): $result" >> logfile
else
    echo "Command executed successfully on $(date)" >> logfile
fi

답변3

Greg의 Wiki에 항목이 있습니다.스트림의 각 줄에 타임스탬프를 추가합니다.여기에는 환경에 따라 다양한 방법이 포함됩니다. 그들은 모두 루프/프로세스를 통해 스트림을 파이핑하고 POSIX 호환 버전을 추가하는 것으로 요약됩니다.

while IFS= read -r line; do
    echo "$(date +%Y%m%d-%H:%M:%S) $line"
done

관련 정보