我有一个 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
(使用一些内部tee
ing)。
你会看到类似的东西:
$ 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=1
仅报告使用超过 1 秒 CPU 时间的进程。也可以看看REPORTMEMORY
。