스크립트 내부에서 표준 출력으로 로그하는 방법

스크립트 내부에서 표준 출력으로 로그하는 방법

다음을 사용하여 로그인할 수 있다는 것을 알고 있습니다.tee

하지만 에서 실행하는 동안 스크립트 내부에서 로그인하고 싶습니다 stdout.

예를 들어 내 코드는 다음과 같습니다.

    names=$(print("name1 name2 name3 name4"))

    for name in names
    do
       echo "Current Name: " $name 
       related_job= ps -ef | grep $name | awk '{print $9}' >> File.dat
       echo "related job: " $related_job
    done 

이제 이 청크는 확실히 echostdout에 있지만 로그 파일(예: script_name.log.

또한 스케줄러를 통해 스크립트를 호출하고 사용할 수 없는 제약 조건을 고소합니다 script_name | tee log_file. 이름으로 스크립트를 부를 수 있습니다.

이 문제를 해결할 방법이 있나요?

답변1

를 사용하는 경우 bashbash의 를 결합하여 exec >&스크립트의 모든 출력을 리디렉션하고 프로세스 대체를 수행할 수도 있습니다.

예를 들어 스크립트 시작 부분에 다음과 같은 내용을 추가합니다.

LOGFILE='/tmp/teelog.log'
savelog "$LOGFILE"
exec &> >(tee "$LOGFILE")

savelog이는 stdout 및 stderr를 stdout 및 $LOGFILE로 리디렉션합니다. 이는 스크립트가 실행될 때마다 이전 로그를 회전하고 유지하는 데 사용됩니다 (기본값은 7).

답변2

매우 간단합니다. tee옵션 플래그와 함께 사용됩니다.~에스크립트를 호출할 때가 아닙니다.

줄 끝에 echo추가| tee -a logfile

> file| tee file리디렉션 대신 표준 출력으로 텍스트를 보내는 방법을 사용할 수도 있습니다 . (이렇게 하면 > file리디렉션 처럼 파일을 추가하는 대신 파일을 덮어씁니다 .)

>> mylog.log리디렉션 대신 사용할 수 있습니다 | tee -a mylog.log.

출력과 관련된 행이 많은 경우 echo를 대체하기 위해 스크립트 에서 echo $* | tee -a logfile.$*

답변3

tee어쩌면 그것이 당신이 원하는 것일 수도 있습니다. 스크립트 시작 부분에 다음 줄을 추가합니다.

exec 1> >(tee -a logfile)
exec 2>&1

첫 번째 줄은 -a표준 출력에서 ​​스트리밍된 모든 것을 리디렉션하고 추가( ) logfile하여 화면에 인쇄합니다. 두 번째 줄은 표준 오류를 표준 출력으로 리디렉션합니다.


awk특히 화면에 출력을 원하지만 날짜가 기록된 경우에도 작동합니다 .

exec 1> >(awk -W interactive '{"date" | getline d; print $0; print d, $0 >> "logfile"}')
exec 2>&1

awk대화형으로 설정해야 하며 awk는 버퍼링되지 않은 표준 출력에 씁니다. 원하는 경우 다음을 통해 표준 오류를 다른 항목(아마도 다른 로그 파일)으로 리디렉션할 수 있습니다.

exec 2> >(...)

관련 정보