내 스크립트의 모든 출력 및 날짜를 ​​기록합니다.

내 스크립트의 모든 출력 및 날짜를 ​​기록합니다.

출력을 반환하는 타사와 함께 여러 다른 스크립트를 실행하는 run.sh가 있습니다. 내 run.sh에는 유익한 에코 정보도 있습니다...

특정 프로세스의 속도도 확인하고 싶기 때문에 각 명령의 날짜와 함께 모든 것을 기록하는 것을 스크립트 상단에 추가하고 싶습니다. tee와 스크립트가 이 작업을 수행할 수 있다는 것을 확인했습니다. 여러 번 시도했지만 사용 중인 컴퓨터에 tee가 설치되어 있지 않고(쉽게 설치할 수 없는 클러스터입니다) 방금 받은 스크립트를 사용하고 있습니다.

Script started, file is log.txt
Script started, file is log.txt
Script started, file is log.txt
Script started, file is log.txt
Script started, file is log.txt

편집하다:

나는 이것을하는 방법을 알아 냈습니다

exec >logfile.txt 2>&1

하지만 여전히 각 행의 시작 부분에 데이터를 추가하는 방법을 모르겠습니다. 이 접근 방식을 사용하면 이제 터미널에서 출력을 볼 수 없습니다.

답변1

나는 항상 스크립트 시작 부분에 "echo_do"라는 작은 함수를 추가하고 아래와 같이 해당 함수를 통해 명령을 실행합니다.

#! /usr/bin/ksh

echo_do () {
  echo $(date) "$@"
  eval "$@"
}

echo_do pwd
echo_do sleep 3
echo_do "ls -l /tmp | wc"
echo_do sleep 3
echo_do "find /tmp | wc"

예를 들어, 자신만의 "티셔츠"를 만들 수도 있습니다. "티.sh":

#! /usr/bin/ksh

IFS=""

if [ "X"$1 == "X-a" ]
then
  shift
else
  for OF in $@
  do
    > $OF
  done
fi

while read
do
  for OF in $@
  do
    echo "$REPLY" >> $OF
  done
  echo "<$REPLY>"
done

원하는 곳에 필요한 시간을 삽입하세요.

답변2

zsh스크립트 에서는 다음을 수행할 수 있습니다.

{
  PS4='[%D{%FT%T.%6.%z}] %N:%i> '
  set -o xtrace

  # rest of the script goes here.

} >&1 > file.log 2>&1

그러면 stdout 및 stderr(xtrace 출력 포함)에 대한 타임스탬프를 포함한 출력이 추가되고 xtrace원시 stdout으로 리디렉션되며 file.log(일부 내부 teeing 사용)

다음과 같은 내용이 표시됩니다.

$ zsh ./myscript.zsh
[2022-01-06T17:07:34.977886+0000] ./myscript.zsh:4> echo before
before
[2022-01-06T17:07:34.978244+0000] ./myscript.zsh:5> sleep 1
[2022-01-06T17:07:35.979618+0000] ./myscript.zsh:6> echo after
after

또한 REPORTTIME이 변수를 0으로 설정하여 zsh종료된 각 프로세스(및 대기 중인 프로세스)의 리소스 사용량을 출력할 수도 있습니다. 기본적으로 CPU 시간(사용자 및 시스템)과 경과 시간이 포함되지만 변수를 사용하여 다른 리소스를 표시하도록 구성할 수 있습니다 TIMEFMT. REPORTTIME=1CPU 시간을 1초 이상 사용하는 프로세스만 보고됩니다. 당신은 또한 볼 수 있습니다 REPORTMEMORY.

관련 정보