stderr를 파일로 리디렉션하지만 stderr이 발생한 경우에만 생성하시겠습니까? [복사]

stderr를 파일로 리디렉션하지만 stderr이 발생한 경우에만 생성하시겠습니까? [복사]

다음과 같은 명령을 실행하고 있습니다.

parallel --spreadstdin --line-buffered 'some_command 2> `mktemp --tmpdir /tmp/stderr`' | do_something

비결은 parallel많은 프로세스를 생성하여 모두 stderr 파일을 얻는 것입니다. 대부분은 비어 있기 때문에 흥미롭지 않습니다. 표준 오류 출력이 실제로 발생할 때만 쉘이 stderr 파일을 생성하도록 하려면 어떻게 해야 합니까?

답변1

내가 아는 한 이것은 불가능합니다. 셸은 오른쪽에서 왼쪽으로 읽으므로 파일이 2> error있으면 생성됩니다. error나는 이 문제를 해결할 방법이 없다고 생각합니다.

명명된 파이프를 사용하고 그 출력을 테스트하는 것과 같은 몇 가지 복잡한 트릭을 수행할 수 있지만 실제로는 그럴 가치가 없다고 생각합니다. 대신, inotify다른 답변의 지침을 따르거나 tmp 파일을 만들어 다른 위치에 복사합니다(데이터가 포함된 경우).

tmp=$(mktemp); command 2> "$tmp"; [ -s "$tmp" ] && cp "$tmp" /path/to/log/files

답변2

병렬 --spreadstdin --line-buffered 'some_command 2 \

mktemp --tmpdir /tmp/stderr' | do_something && if [test -s /tmp/stderr] then;

  • 파일이 존재하고 크기가 0보다 큰지 테스트하는 단일 행(TRUE), FALSE인 경우 비어 있습니다.

IT는 효과적인 일을 하는 것입니다. 비트 및 바이트 계산을 중지하고 시작 시 inotifywait 트리거를 생성하여 로그가 비어 있는지 확인하고 결과를 데이터 테이블에 기록한 다음 완료 시 로그를 지운 다음 오류 로그에 키워드가 나타날 때 웹 인터페이스를 작성합니다. , 인터페이스에서 이메일을 보내드립니다.

while:
  do
    inotifywait -e create /tmp/* && \
      if [ -s /tmp/stderr ]
        then
        ##put it in a datatable
        ##remove the log
      fi
  done

iNotifyWait는 또한 커널 F/S 하위 시스템을 모니터링하여 파일이 변경되었는지(추가가 진행 중인 경우) 확인할 수 있습니다. 그렇지 않으면 소스 코드를 수정하고 try() catch() 또는 오류 보고 섹션(오류 코드를 화면에 인쇄하는 섹션)을 수정하여 오류를 방지하도록 다시 컴파일합니다.

답변3

의외로 답이 너무 가깝다SO에 대한 또 다른 질문이 질문에 대답하려고 했지만 요점을 놓쳤습니다. 다음과 같이 쉘 함수를 정의하십시오(또는 스크립트 작성).

save_err()
{
    # Check that "$1" is set and either complain/abort or generate a default.
    if read -r x
    then
        { printf "%s\n" "$x"; cat; } > "$1"
    fi
}

그런 다음 다음과 같이 사용됩니다.

some_command 2> >( save_err $(mktemp --tmpdir /tmp/stderr) )

참고: stderr 출력이 한 줄이면 실패합니다. 개행 문자로 끝나지 않습니다.. 이 문제를 해결하려면 함수 내부를 다음과 같이 변경하세요.

    if read -r x
    then
        { printf "%s\n" "$x"; cat; } > "$1"
    elif [ "$x" != "" ]
    then
        printf "%s" "$x" > "$1"
    fi

printf대신 echo대시로 시작하거나 백슬래시가 포함된 텍스트를 방지하기 위해 사용합니다 . stderr 출력의 첫 번째 줄에 ASCII가 아닌 문자가 포함되어 있으면 문제가 발생할 수 있습니다.

관련 정보