我如何完全logging所有bash脚本操作?

我想从脚本输出中捕获所有的日志数据,包括错误消息,并将它们全部redirect到日志文件

我有像下面的脚本:

#!/bin/bash ( echo " `date` : part 1 - start " ssh -f [email protected] 'bash /www/htdocs/server.com/scripts/part1.sh logout exit' echo " `date` : sleep 120" sleep 120 echo " `date` : part 2 - start" ssh [email protected] 'bash /www/htdocs/server.com/scripts/part2.sh logout exit' echo " `date` : part 3 - start" ssh [email protected] 'bash /www/htdocs/server.com/scripts/part3.sh logout exit' echo " `date` : END" ) | tee -a /home/scripts/cron/logs 

我想查看文件/home/scripts/cron/logs所有操作

但是我只看到了这个echo命令后面的内容。

如何检查日志是SSH命令成功?

我需要收集所有的日志数据。 我需要这个监视脚本中每个命令的结果,以便更好地分析脚本失败时发生了什么。

我通常在每个脚本的开始部分放置类似于以下内容的东西(尤其是如果它将作为守护进程运行的话):

 #!/bin/bash exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 exec 1>log.out 2>&1 # Everything below will go to the file 'log.out': 

说明:

  1. exec 3>&1 4>&2

    保存文件描述符,以便它们可以恢复到redirect之前的状态,或者用它们自己输出到之前的redirect之前。

  2. trap 'exec 2>&4 1>&3' 0 1 2 3

    恢复特定信号的文件描述符。 通常不需要,因为当子壳退出时它们应该被恢复。

  3. exec 1>log.out 2>&1

    stdoutredirect到文件log.out然后将stderrredirect到stdout 。 请注意,当你希望他们去相同的文件时,顺序是重要的。 stderr被redirect到stdout之前, stdout 必须被redirect。

从此,在控制台上看到输出(也许),你可以简单地redirect到&3 。 例如,

 echo "$(date) : part 1 - start" >&3 

将执行stdout地方,大概是控制台,在执行上面的第3行之前。

要获得ssh输出到你的日志文件,你必须将stderrredirect到stdout 。 你可以通过在你的bash脚本之后附加2>&1

它应该是这样的:

 #!/bin/bash ( ... ) 2>&1 | tee ... 

当这不以正确的顺序显示消息时,尝试添加另一个子shell:

 #!/bin/bash (( ... ) 2>&1) | tee ... 

当我读到你的问题时,你不想logging输出,而是logging整个命令序列,在这种情况下,其他答案不会帮助你。

用-x调用shell脚本输出所有内容:

sh -x foo.sh

通过以下方式login到您想要的文件:

sh -x foo.sh >> /home/scripts/cron/logs

在bash中,你可以放置set -x ,它会打印出它执行的每个命令(和bashvariables)。 您可以用set +xclosures它。

如果你想成为偏执的人,你可以在你的脚本中set -o errexit 。 这意味着如果一个命令返回一个非零的退出代码,这个脚本将会失败并停止,这是unix标准的方式来表示出了错误。

如果你想得到更好的日志,你应该看看在moreutils debian / Ubuntu的包的ts 。 它会在每行的前面添加一个时间戳并将其打印出来。 所以你可以看到事情发生的时间。