记录我的脚本的所有输出和日期

记录我的脚本的所有输出和日期

我有一个 run.sh,它与返回输出的第三方一起运行许多其他脚本。我的 run.sh 也有一些信息丰富的 echo INFO ...

我想在脚本顶部添加一些内容,用每个命令的日期记录所有内容,因为我还想检查某些过程的速度。我已经看到 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"

您还可以自制您的“T恤”,例如。 “tee.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

这将添加xtrace输出,包括带有 stdout 和 stderr(包括 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 时间(用户和系统)和经过的时间,但可以配置为使用变量显示其他资源TIMEFMTREPORTTIME=1仅报告使用超过 1 秒 CPU 时间的进程。也可以看看REPORTMEMORY

相关内容