다음을 사용하여 로그인할 수 있다는 것을 알고 있습니다.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
이제 이 청크는 확실히 echo
stdout에 있지만 로그 파일(예: script_name.log
.
또한 스케줄러를 통해 스크립트를 호출하고 사용할 수 없는 제약 조건을 고소합니다 script_name | tee log_file
. 이름으로 스크립트를 부를 수 있습니다.
이 문제를 해결할 방법이 있나요?
답변1
를 사용하는 경우 bash
bash의 를 결합하여 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> >(...)